我想读取二进制文件,获取四个字节乘以四个字节的内容,并对这些数据包执行int操作.
使用虚拟二进制文件,以这种方式打开:
with open('MEM_10001000_0000B000.mem', 'br') as f:
for byte in f.read():
print (hex(byte))
Run Code Online (Sandbox Code Playgroud)
例如,我想用4字节长的密钥执行加密0x9485A347.
有一种简单的方法我可以一次读取我的文件4个字节并将它们作为int或者我需要使用计数器将它们放入临时结果吗?
我最初的想法如下:
current_tmp = []
for byte in data:
current_tmp.append(int(byte))
if (len(current_tmp) == 4):
print (current_tmp)
# but current_tmp is an array not a single int
current_tmp = []
Run Code Online (Sandbox Code Playgroud)
在我的例子中,而不是[132, 4, 240, 215]我宁愿拥有0x8404f0d7
只需使用read的"amount"参数一次读取4个字节,然后使用Python 3的"from_bytes"构造函数int来实现它:
with open('MEM_10001000_0000B000.mem', 'br') as f:
data = f.read(4)
while data:
number = int.from_bytes(data, "big")
...
data = f.read(4)
Run Code Online (Sandbox Code Playgroud)
如果您由于某种原因尚未使用Python 3,int则不会使用from_bytes方法 - 那么您可以使用struct模块:
import struct
...
number = struct.unpack(">i", data)[0]
...
Run Code Online (Sandbox Code Playgroud)
然而,这些方法适用于几个交互,并且对于大文件可能会变慢 - Python提供了一种方法,您可以直接从开放文件中直接在内存中填充4字节整数数组 - 这更可能是您应该的使用:
import array, os
numbers = array.array("i")
with open('MEM_10001000_0000B000.mem', 'br') as f:
numbers.fromfile(f, os.stat('MEM_10001000_0000B000.mem').st_size // numbers.itemsize)
numbers.byteswap()
Run Code Online (Sandbox Code Playgroud)
一旦你有了数组,就可以用类似的东西对它进行xor
from functools import reduce #not needed in Python2.7
result = reduce(lambda result, input: result ^ input, numbers, key)
Run Code Online (Sandbox Code Playgroud)
将为您提供一个numbers序列,其中您的文件中的所有数字都以4字节,大端,有符号整数读入.
如果你的文件不是4个字节的倍数,前两个方法可能需要一些调整 - 修复while条件就足够了.