Python - 递增文件1

时间:2014-11-20 15:08:34

标签: python file hex byte

我有一个包含以下十六进制值的文件:

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

它给出了意想不到的结果。

5 个答案:

答案 0 :(得分:0)

您可以先将文件内容读取为整数,然后递增整数,并将整数作为十六进制写入文件

value = int('0x' + open(filename,'r').read()) value += 1 open(filename, 'w').write(str(hex(value)).replace('0x','')

答案 1 :(得分:0)

如果您知道文件中的总字节数,则可以将整个内容读入bytearraybytes对象,然后将其传递给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)