我正在使用二进制模式在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}
答案 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值的系统中读取数据,则可能还需要在格式字符串中指定字节顺序。
(i
和h
是已签名的int版本;如果您想要无符号,请使用I
和H
)
答案 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}