我有一个hex文件,如下所示: -
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
我想读第3和第4个字节。交换这两个字节并将它们保存在变量中。例如,我想在变量" num"
中保存0xFF11(在byteswap之后)这是我试过的: 我逐个读了这两个字节
data=open('xyz.bin','rb').read()
num1=data[2]
num2=data[3]
num1,num2=num2,num1
num= num1*100+num2
print(num)
现在问题是num变量有整数值,我不知道如何将十六进制加入其中。 我被困在这里,无法继续前进。任何帮助都会受到欢迎。
PS:我对python很新。
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:3)
首先,您必须将num1
乘以256
,当然不是100
(您可以将小数256
写为0x100
,但是,如果这有助于使你的意图更清晰)。
其次,要将整数格式化为十六进制数,请使用
print("{:x}".format(num))
例如:
>>> num1 = 0xff
>>> num2 = 0xab
>>> num = num1*256 + num2
>>> print("{:x}".format(num))
ffab
答案 3 :(得分: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)
答案 4 :(得分:0)