使用Python读取十六进制文件中的多个字节

5

我有一个十六进制文件,如下所示:

00000000 AA AA 11 FF EC FF E7 3E FA DA D8 78 39 75 89 4E
00000010 FD FD BF E5 FF DD FF AA E9 78 67 84 90 E4 87 83
00000020 9F E7 80 FD FE 73 75 78 93 47 58 93 EE 33 33 3F

我想读取第三个和第四个字节,交换这两个字节并将它们保存在一个变量中。例如,我想要将0xFF11(字节交换后)保存在变量“num”中。
这是我尝试过的: 我逐个读取了这两个字节。
data=open('xyz.bin','rb').read()
num1=data[2]
num2=data[3]
num1,num2=num2,num1
num= num1*100+num2
print(num)

现在的问题是num变量是整数值,而我不知道如何将十六进制转换成整数。

我卡在这里,无法继续了。欢迎任何帮助。

附:我对Python非常陌生。


只需将倒数第二行更改为num = (num1 << 8) + num2或者不交换字节并使用num = (num2 << 8) + num3 - martineau
如果你想从文件中读取许多数字,可以使用 array.array。请参见 Improve speed of reading and converting from binary file with python - jfs
5个回答

7
import struct

with open("xyz.bin", "rb") as f:
    f.seek(2)
    num, = struct.unpack("<H", f.read(2))
    print "little endian:", hex(num), num  # little endian: 0xff11 65297

5
在Python 3中,您可以直接从字节创建整数:
with open('xyz.bin','rb') as file:
    file.seek(2)
    num = int.from_bytes(file.read(2), 'little')
    print(hex(num), num) # -> 0xff11 65297

3

首先,你需要将num1乘以256,而不是100(如果这有助于使您的意图更清晰,您可以将十进制的256写为0x100)。

其次,要将整数格式化为十六进制数字,请使用:

print("{:x}".format(num))

例如:

>>> num1 = 0xff
>>> num2 = 0xab
>>> num = num1*256 + num2
>>> print("{:x}".format(num))
ffab

0

最好的方法是使用 struct 模块。在此输入图片描述


0

您可能对以下一些/全部操作感兴趣,它们可以抽象出所有的位运算,否则您将不得不进行这些运算。

import struct

line = '00000000 AA AA 11 FF EC FF E7 3E FA DA D8 78 39 75 89 4E'.split()

bytearray(int(x,16) for x in line[3:5])
Out[42]: bytearray(b'\x11\xff')

struct.unpack('H',bytearray(int(x,16) for x in line[3:5]))
Out[43]: (65297,) 

hex(65297)
Out[44]: '0xff11'

packed_line = bytearray(int(x,16) for x in line[1:])

struct.unpack('{}H'.format(len(packed_line)/2),packed_line)
Out[47]: (43690, 65297, 65516, 16103, 56058, 30936, 30009, 20105)

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