0

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

为了解释分区中第一个绝对扇区的 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 来执行此操作?intVar=(int*)someBasePointer作为C 中的类型转换


在标记为已回答后添加:

有没有办法为奇数位结构做到这一点?就像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}
4

2 回答 2

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]

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

( iandh是有符号的 int 版本;如果你想要无符号的,使用Iand H)

于 2012-10-20T18:16:06.770 回答
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}
于 2012-10-20T18:16:36.193 回答