我有一个包含以下十六进制值的文件:
00 00 00 00 00 00 00 00
我想要做的就是将此文件增加一个。即在运行程序之后,我将留下:
00 00 00 00 00 00 00 01
当我到达时:
00 00 00 00 00 00 00 FF
我希望下一个增量让我:
00 00 00 00 00 00 01 00
有一种简单的方法可以使用字节数组或类似的方法吗?
编辑:
这就像我之前的代码:
filename = 'file'
with open(filename, "rb+") as file:
seek = -1
while True:
file.seek(seek, 2)
value = file.read(1).encode('hex')
file.seek(seek, 2)
if value != 0xFF:
file.write(str(int(value, 16) + 0x1))
break
else:
file.write(str(0x00))
seek -= 1
它给出了意想不到的结果。
答案 0 :(得分:0)
您可以先将文件内容读取为整数,然后递增整数,并将整数作为十六进制写入文件
value = int('0x' + open(filename,'r').read())
value += 1
open(filename, 'w').write(str(hex(value)).replace('0x','')
答案 1 :(得分:0)
如果您知道文件中的总字节数,则可以将整个内容读入bytearray
或bytes
对象,然后将其传递给struct.unpack()
。但是对于大于64位(8字节)的任何内容都不起作用,如果字节数不是2的幂,则需要填充它。
在更一般的情况下,您可以使用按位运算将数字简单地吸入内存:
number = 0
while True:
next_byte = f.read(1)
if next_byte == b'':
break
number <<= 8
number |= next_byte[0]
不幸的是,把它写回来的说法稍微不那么简单了:
import io
scratch = io.BytesIO()
while number:
scratch.write(number & 0xFF)
number >>= 8
data = scratch.value()[::-1]
f.write(data)
答案 2 :(得分:0)
我想出了一个基于我之前尝试的答案:
import binascii
filename = 'file'
with open(filename, "rb+") as file:
seek = -1
while True:
file.seek(seek, 2)
value = file.read(1).encode('hex')
file.seek(seek, 2)
if value != 'ff':
hb = binascii.a2b_hex("%02x" % (int(value, 16) + 0x01))
file.write(hb)
break
else:
file.write(binascii.a2b_hex('00'))
seek -= 1
我不喜欢它,但它现在有效。
如果可能,我希望看到更好的答案? :)
答案 3 :(得分:0)
您的问题不完全清楚,但我认为您的文件最初包含24个字符'0' '0' ' ' ... ' ' '0' '0' 'LF'
。
如果我没错,您可以将文件中的签名作为字符串读取,将其传递给下面的函数,并在任何地方写下它返回的字符串。
def hex_incr(str):
hl = str.split()
num = 1
for i, h in enumerate(hl):
num += int(h,16)*256**(7-i)
rep = "%016X"%(num,)
return " ".join([rep[i:i+2] for i in range (0,16,2)])
我还有一些测试
print hex_incr("00 00 00 00 00 10 01 01")
print hex_incr("00 00 00 00 00 00 00 FF")
print hex_incr("00 00 00 00 00 10 FF FF")
print hex_incr("00 00 00 00 0D 10 01 01")
产生
00 00 00 00 00 10 01 02
00 00 00 00 00 00 01 00
00 00 00 00 00 11 00 00
00 00 00 00 0D 10 01 02
def hex_incr(s): return " ".join([r[i:i+2] for r in ["%016X" % (1 + int("".join(s.split()), 16),)] for i in range(0,16,2)])
答案 4 :(得分:0)
如果您使用的是Python3,则可以使用int.from_bytes()
和int.to_bytes()
:
filename = 'file'
with open(filename, "rb") as data_file:
data = data_file.read()
length = len(data)
data = int.from_bytes(data, 'big')
data += 1
with open(filename, "wb") as data_file:
data = data.to_bytes(length, 'big')
data_file.write(data)