在Python中,以十进制数的形式读取文件的块



我的输入文件可以是任意的,所以我将使用

f = open("in-file", 'rb')

块大小大约是4K字节,所以我将使用

f.read(4096)

我要做的是从文件中逐块读取数据。此外,由于chunk实际上是一个$2^15$ bit (4KB)序列,因此在读取chunk时,我需要将其转换为十进制值以供进一步计算。

例如,如果第一个数据块的格式为0000…10,我想要的是另一个变量保持相应的十进制值,例如。x = 2。

从Convert string to list of bits,反之亦然,我知道它的代码可以帮助我一个块一个块地读取。

def tobits(s):
    result = []
    for c in s:
        bits = bin(ord(c))[2:]
        bits = '00000000'[len(bits):] + bits
        result.extend([int(b) for b in bits])
    return result

但是,我不知道如何将输出列表转换为十进制值。有人能给我一些示例代码吗?谢谢你。

通过引用http://code.activestate.com/recipes/510399-byte-to-hex-and-hex-to-byte-string-conversion/,我发现下面的代码可能会运行得更快,因为它似乎没有涉及算术。

def ByteToHex( byteStr ):
    return ''.join( [ "%02X " % ord( x ) for x in byteStr ] ).strip()

因此,例如,将2字节块读取为十进制数的任务可以通过以下代码完成:

in_file=open("in-file", "rb")
piece = in_file.read(2)
a=ByteToHex(piece)
a=int(a,16)

如果我没理解错的话,您应该是这样做的:

def bytes_to_long(bytes):
    result = 0l
    for c in bytes:
        result *= 256
        result += ord(c)
    return result

也就是说,这可能会有点慢,4kB是一个相当大的long,并且将创建许多垃圾。您可能可以通过使用struct.unpack()并在每次迭代中处理多个字节来改进这一点,但这样您就必须处理正确的端序和其他事项。在Python 3中,您可能也不需要ord(),因为它应该从IO方法返回bytes类型。

相关内容

  • 没有找到相关文章

最新更新