stuct.unpack() 以不同顺序读取十六进制转储文件数据

问题描述 投票:0回答:1

我正在使用 struct.unpack() 读取十六进制转储文件并将其转换为二进制表示形式,因为我只对少数位感兴趣。以下是一次阅读的示例。

我的二进制数据:(b'E\x01') 我的十六进制字符串:'45 01'

```bin(struct.unpack('<H', binary_bytes[20:22])[0])[2:].zfill(16)```

我知道数据以 uint16 格式打包,因此我正在读取两个字节。对于这段特定的代码,我得到“0101100101111101”作为返回值。

现在我需要将其拆分以读取 3 个不同的值。预定义 value_1 占 7 位,value_2 占 7 位,value_3 占 1 位。

value_1 = 125 (1111101)  
value_2 = 50 (0110010)  
value_3 = 1 (1)```

How do I get the formula to return 1111101011001010?

I think the hex dump file waas coded with C but I am using python to decode it.
python struct endianness unpack hexdump
1个回答
0
投票

第一步:将原始二进制数据分割成块。

original_bin_data = b"0101100101111101"
original_dec_data = int(original_bin_data,2) #22909
splited_bin = lambda bin_data, splitter: [int(bin_data[i*splitter:i*splitter+splitter],2) for i in range(int(len(bin_data) / splitter) + (len(bin_data) % splitter > 0))]
splitter = 7
value_1,value_2,value_3 = splited_bin(original_bin_data,splitter)

输出:

value_1 = 44
value_2 = 95
value_3 = 1

选项 1:左移运算符。

dec_data1 = (value_1<<9)+(value_2<<2)+(value_3<<1)
bin_data1 = bin(dec_data1)
print(dec_data1, bin_data1)

选项2:f字符串格式化:更多信息可在关于格式化字符串文字格式规范迷你语言的官方文档中找到。

bin_data2 = f'{value_1:07b}{value_2:07b}{value_3<<1:02b}'
dec_data2 = int(bin_data2,2)
print(dec_data2, bin_data2)

两种情况下的输出:

22910 0b101100101111110
© www.soinside.com 2019 - 2024. All rights reserved.