使用Python读取十六进制文件中的多个字节
我有一个十六进制文件,内容如下:
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非常陌生。
5 个回答
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)
5
在Python 3中,你可以直接从字节(bytes)创建一个整数(integer):
with open('xyz.bin','rb') as file:
file.seek(2)
num = int.from_bytes(file.read(2), 'little')
print(hex(num), num) # -> 0xff11 65297
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
3
首先,你需要把 num1
乘以 256
,当然不是乘以 100
(如果这样写能让你更明白的话,你也可以把十进制的 256
写成 0x100
)。
其次,要把一个整数格式化成十六进制数字,可以使用
print("{:x}".format(num))
例如:
>>> num1 = 0xff
>>> num2 = 0xab
>>> num = num1*256 + num2
>>> print("{:x}".format(num))
ffab