gpt4 book ai didi

Python3 读取一个二进制文件,一次 4 个字节,并用一个 4 字节长的 key 对它进行异或运算

转载 作者:太空狗 更新时间:2023-10-30 00:54:07 44 4
gpt4 key购买 nike

我想读取一个二进制文件,四字节乘四字节获取内容,并对这些数据包进行整型运算。

使用虚拟二进制文件,以这种方式打开:

with open('MEM_10001000_0000B000.mem', 'br') as f:
for byte in f.read():
print (hex(byte))

我想用 4 字节长的 key 执行加密,例如 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 = []

在我的示例中,与其使用 [132, 4, 240, 215],不如使用 0x8404f0d7

最佳答案

只需使用 read 的“amount”参数一次读取 4 个字节,以及 Python 3 int 的“from_bytes”构造函数即可:

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)

如果出于某种原因您还没有使用 Python 3,int 将不会提供 from_bytes 方法 - 那么您可以求助于使用结构模块:

import struct
...
number = struct.unpack(">i", data)[0]
...

然而,这些方法适用于几次交互,对于大文件可能会变慢 - 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()

一旦你有了数组,你可以用类似的东西对它进行异或

from functools import reduce #not needed in Python2.7
result = reduce(lambda result, input: result ^ input, numbers, key)

会给你一个 numbers 序列,你的文件中的所有数字都以 4 字节、大端、有符号整数的形式读入。

如果您的文件不是 4 字节的倍数,前两种方法可能需要一些调整 - 修复 while 条件就足够了。

关于Python3 读取一个二进制文件,一次 4 个字节,并用一个 4 字节长的 key 对它进行异或运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40890697/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com