在Python中,读取文件的块作为十进制数

时间:2013-01-17 17:04:25

标签: python file decimal bit-manipulation

我的输入文件可能是任意的,因此我将使用

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

块大小约为4K字节,因此我将使用

f.read(4096)

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

例如,如果第一个块的形式为0000 ... 10,那么我想要的是另一个变量保持相应的十进制值,例如,x = 2.

Convert string to list of bits and viceversa我知道它的代码可以帮助我按块读取块。

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

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

2 个答案:

答案 0 :(得分:1)

通过引用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)

答案 1 :(得分:0)

如果我理解正确的问题,您需要以下内容:

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类型。