Python,阅读Hex Little Endian用它进行数学数,并将结果覆盖为旧位置



我是新手编程,我需要帮助我有一个类似的十六进制文件:

43 52 53 00 00 00 00 00 00 00 01 01 01 30 00 00 00 00

10 87 01 00 13 00 00 00 10 00 00 00 00 00 00 00 00 00

40 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

我需要python代码,让我阅读小endian" 10 87 01"做数学

喜欢10 87 01 40 01 = 50 88 01

43 52 53 00 00 00 00 00 00 00 01 01 01 30 00 00 00 00

50 88 01 00 13 00 00 00 10 00 00 00 00 00 00 00 00 00

40 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

希望它的清晰

您可以使用struct库来处理小恩迪安P>

对于您的特定任务,我不知道我是否正确理解,因为您没有指定二进制文件中有哪种数据...让我们假设我们已经签署了32位整数,我的代码将成为这样的事情:

import struct
# we are assuming you have 32 bit integers on your file
block_size = 4
filename = "prova.bin"

# function to do "some math... :)"
def do_some_math(my_hex_value):
    return my_hex_value + 1

# open and read the whole file
with open(filename, "r+b") as f:
    my_byte = f.read(block_size)
    while(len(my_byte) == block_size):
        # unpack the 4 bytes value read from file
        # "<" stands for "little endian"
        # "i" stands for "integer"
        # more info on the struct library in the official doc
        my_hex_value = struct.unpack_from("<i", my_byte)[0]
        print("Before math = " + str(my_hex_value))
        # let's do some math
        my_hex_value = do_some_math(my_hex_value)
        print("After math = " + str(my_hex_value))
        # let's repack the hex back
        my_byte = struct.pack("<i", my_hex_value)
        # let's reposition the file pointer so as to overwrite
        # the bytes we have previously read 
        f.seek(f.tell() - block_size)
        # let's override the old bytes
        f.write(my_byte)
        # let's read another chunk to repeat till the eof
        my_byte = f.read(block_size)

希望这会有所帮助
最好的
dave

假设您的数学功能可以计算新模式,则可以使用这样的函数:

def replace_pattern(old_pattern, new_pattern, occurrence):
with open('input_file.txt','r') as myfile:
    myline=""
    for line in myfile:
        myline += line
if occurrence == 0: # assume 0 is used to indicate all occurrences must be replaced
    if myline.find(old_pattern) == -1:
        print('pattern not found, exit')
        return
    else:
        newline = myline.replace(old_pattern, new_pattern)
else: #a particular occurrence has to be updated
    idx = 0
    offset=0
    nbmatch = 0
    while idx != -1:
        idx = myline.find(old_pattern, offset)
        if idx != -1:
            offset = idx+1
            nbmatch += 1
        if nbmatch == occurrence:
            # the index of the target occurrence has been reached
            break
    if nbmatch == 0:
        print('problem, at least one occurrence expected')
        return
    elif nbmatch == 1:
        print('problem, more than one occurrence expected, replace anyway')
        newline = myline.replace(old_pattern, new_pattern)
    else:
        # further processing on a part of the line
        sameline = myline[:idx]
        diffline = myline[idx:]
        # work on diffline substring
        diffline = diffline.replace(old_pattern,new_pattern,1)
        # rebuild line
        newline = sameline+diffline
with open('input_file.txt','w') as myfile:
    myfile.write(newline)

我可能没有被优化,但应该按预期工作

最新更新