在python中将二进制字符串解释为整数

时间:2012-10-20 18:10:17

标签: python

我正在使用二进制模式在python中读取文件(磁盘映像和/ dev / sda等)。我正在读取第一个扇区(512字节)并尝试打印磁盘信息(参考:Wikipedia Articles)。

为了解释分区中第一个绝对扇区的32位LBA之类的东西,我正在做的事情 -

def int32(bytes):
    return int(bytes[3]<<24|bytes[2]<<16|bytes[1]<<8|bytes[0])

def int16(bytes):
    return int(bytes[1]<<8|bytes[0])

print('LBA:',int32(partitionEntry[8:12]))

在python中有本地wat吗?作为C中的类型转换intVar=(int*)someBasePointer


在标记为已回答后添加:

有没有办法为奇数位结构执行此操作?就像CHS一样。 C(柱面)是一个字节的10位8位,另一个字节的2位。我目前的做法是

def getCHS(bytes):
    c=bytes[1]&3<<8|bytes[2]
    h=bytes[0]
    s=bytes[1]&63
    return {'c':c,'s':s,'h':h}

2 个答案:

答案 0 :(得分:4)

您需要struct.unpack()功能。

import struct

def int32(some_bytes):
    return struct.unpack("i", some_bytes)[0]

def int16(some_bytes):
    return struct.unpack("h", some_bytes)[0]

如果您从使用与当前系统不同的endian值的系统中读取数据,则可能还需要在格式字符串中指定字节顺序。

ih是已签名的int版本;如果您想要无符号,请使用IH

答案 1 :(得分:3)

对于简单的1,2或4字节字段,最好的选择可能是struct.unpack。尝试类似:

def int32(bytes):
    return struct.unpack("i", bytes[:4])[0]

您可能需要使用"<i"">i"作为格式字符串来指定字节序。

然而,更多不寻常的场宽需要掩蔽和/或位移。你的方法运作良好;或者,您可以解压缩足够大小的无符号类型,但它不会节省太多工作:

def getCHS(bytes):
    h, r = struct.unpack("BH", bytes[:3])
    c = r & 0x3F
    s = r >> 10
    return {'c':c,'s':s,'h':h}