0

私は、2 つの値の間の 16 進文字列のインスタンスを 16 進ファイルから検索するプログラムを作成しようとしています。D4135B と D414AC の間で、最初の値から 2 番目の値に到達するまでの間をインクリメントします- 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 バイトのファイルから 16 進文字列を調べ、3 バイトの 16 進文字列が指定された 16 進境界の間にある場合、それを別のファイルに書き込むプログラムです。ジェネレーターを使用して、16 進文字列からのバイトの取得を少しきれいにします。

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 に答える