将二进制文件读入不同的十六进制“类型”中(8位、16位、32位等)

4
我有一个包含二进制数据的文件,该文件内容只有一行。
例子:010101000011101010101
原本这个文件的内容是一个C++对象数组,其数据类型如下:
// Care pseudo code, just for visualisation
int64 var1;
int32 var2[50];
int08 var3;

我想跳过var1var3,仅提取var2的值,并将其转换为一些可读的十进制值。我的想法是逐字节读取文件并将它们转换为十六进制值。在下一步中,我想“组合”(附加)4个这样的十六进制值以获得一个int32值。
示例:0x10 0xAA 0x00 0x50 -> 0x10AA0050

到目前为止,我的代码如下:

def append_hex(a, b):
    return (a << 4) | b

with open("file.dat", "rb") as f:
    counter = 0
    tickdifcounter = 0
    current_byte=" "
    while True:
        if (counter >= 8) and (counter < 208):
            tickdifcounter+=1
            if (tickdifcounter <= 4):
                current_byte = append_hex(current_byte, f.read(1))
                if (not current_byte):
                    break
                val = ord(current_byte)
        if (tickdifcounter > 4):
            print hex(val)
            tickdifcounter = 0
            current_byte=""
        counter+=1
        if(counter == 209):    #209 bytes = int64 + (int32*50) + int08
            counter = 0
    print

现在我的问题是,我的append_hex无法工作,因为这些变量是字符串,所以位移运算符无法使用。
我是Python的新手,请给我一些提示,让我知道如何更好地完成某些操作。
2个回答

1

1

使用ord(x)方法可以将字符转换为整数。为了获得多字节数字的整数值,需要进行左移位。例如,在之前的项目中:

def parseNumber(string, index):
    return ord(string[index])<<24 + ord(string[index+1])<<16 + \
           ord(string[index+2])<<8+ord(string[index+3])

注意,此代码假定使用大端系统,如果要解析小端代码,则需要反转索引。
如果您确切知道结构体的大小(或可以根据文件大小轻松计算),则最好使用 "struct" 模块。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接