0

我正在(尝试)编写一个程序,该程序在十六进制文件中搜索两个值之间的十六进制字符串的实例,例如。在 D4135B 和 D414AC 之间,在第一个值之间递增,直到达到第二个值 - D4135B、D4135C、D4135D 等。我设法让它递增等,但这是我遇到问题的搜索部分。这是我到目前为止的代码,它是从其他地方拼凑而成的,我需要让它以某种方式将所有搜索命中输出到输出文件(file_out)中我已经超出了我对 Python 理解的限制,我确信可能有一种更简单的方法。如果有任何帮助,我将不胜感激。

def search_process(hx):   # searching for two binary strings
    global FLAG
while threeByteHexPlusOne != threeByteHex2: #Keep incrementing until second value reached
If Flag:
    if hx.find(threeByteHex2) != -1:
    FLAG = False #If threeByteHex = ThreeByteHexPlusOne, end search
    Print (“Reached the end of the search”,hx.find(threeByteHexPlusOne))
    Else:
        If hx.find(threeByteHexPlusOne) != -1:
        FLAG = True
    Return -1 #If no results found

if __name__ == '__main__':
    try:
        file_in = open(FILE_IN, "r")   #opening input file
        file_out = open(FILE_OUT, 'w') #opening output file
        hx_read = file_in.read  #read from input file 
        tmp = ''
        found = ''
        while hx_read:   #reading from file till file is empty
            hx_read = tmp + hx_read
            pos = search_process(hx_read)

            while pos != -1:
                hex_read = hx_read[pos:]

                if FLAG:
                    found = found + hx_read

                pos = search_process(hx_read)   
            tmp = bytes_read[]
            hx_read = file_in.read

        file_out.write(found)  #writing to output file

    except IOError:
        print('FILE NOT FOUND!!! Check your filename or directory/PATH')
4

1 回答 1

0

这是一个程序,它一次从文件中查看 3 个字节的十六进制字符串,如果 3 字节的十六进制字符串在给定的十六进制范围之间,它会将其写入另一个文件。它利用生成器使从十六进制字符串中获取字节更清晰。

import base64
import sys

_usage_string = 'Usage: python {} <input_file> <output_file>'.format(sys.argv[0])

def _to_base_10_int(value):
    return int(value, 16)

def get_bytes(hex_str):
    # Two characters equals one byte
    for i in range(0, len(hex_str), 2):
        yield hex_str[i:i+2]

def get_three_byte_hexes(hex_str):
    bytes = get_bytes(hex_str)
    while True:
        try:
            three_byte_hex = next(bytes) + next(bytes) + next(bytes)
        except StopIteration:
            break
        yield three_byte_hex

def find_hexes_in_range(hex_str, lower_bound_hex, upper_bound_hex):
    lower_bound = _to_base_10_int(lower_bound_hex)
    upper_bound = _to_base_10_int(upper_bound_hex)
    found = []
    for three_byte_hex in get_three_byte_hexes(hex_str):
        hex_value = _to_base_10_int(three_byte_hex)
        if lower_bound <= hex_value < upper_bound:
            found.append(three_byte_hex)
    return found

if __name__ == "__main__":
    try:
        assert(len(sys.argv) == 3)
    except AssertionError:
        print _usage_string
        sys.exit(2)
    file_contents = open(sys.argv[1], 'rb').read()
    hex_str = base64.decodestring(file_contents).encode('hex')
    found = find_hexes_in_range(hex_str, 'D4135B', 'D414AC')
    print('Found:')
    print(found)
    if found:
        with open(sys.argv[2], 'wb') as fout:
            for _hex in found:
                fout.write(_hex)

在此处查看有关生成器的更多信息

于 2014-01-13T22:22:20.517 回答