2016-12-14 2 views
-1

Jack hat mir letztes Jahr mit this Python script geholfen. Es war sehr nützlich. Jetzt möchte ich es wieder verwenden, aber die Ausgabe muss dieses Mal in Hex-Werten sein, und es wäre sehr schön, den Versatz zu haben, wenn die 'Nadel' im Heuhaufen gefunden wird. Ist das möglich?Suche nach Hex-Werten und Rückgabe Hex-Wert und Offset

#!/usr/bin/python 
import mmap 
fd = open("file_to_search", "rb") 
needle = "\x35\x5A\x3C\x2F\x74\x69\x6D\x65\x3E" 
haystack = mmap.mmap(fd.fileno(), length = 0, access = mmap.ACCESS_READ) 
i = haystack.find(needle) 
while i >= 0: 
    i += len(needle) 
    print (haystack[i : i + 28]) 
    i = haystack.find(needle, i) 
+1

Python 3? weil Sie 'nadel' als Bytes definieren müssten. –

+0

Ich bin nicht so vertraut mit dem anderen, aber ich kann Python 3 verwenden, wenn es notwendig ist ... – hdk

Antwort

0

Sie es 2 wie dies mit Python tun könnte:

import mmap 

with open("file_to_search", "rb") as fd: 
    needle = "\x35\x5A\x3C\x2F\x74\x69\x6D\x65\x3E" 
    needle_len = len(needle) 
    haystack = mmap.mmap(fd.fileno(), length=0, access=mmap.ACCESS_READ) 
    offset = haystack.find(needle) 
    while offset >= 0: 
     hex_string = ''.join(r'\x%02X' % ord(b) 
           for b in haystack[offset: offset+needle_len]) 
     print('offset: {}, needle: "{}"'.format(offset, hex_string)) 
     offset += needle_len 
     offset = haystack.find(needle, offset) 

Beispielausgabe:

offset: 3, needle: "\x35\x5A\x3C\x2F\x74\x69\x6D\x65\x3E" 

Da sich der Wert needle niemals ändert, scheint es redundant zu sein, seinen Wert jedes Mal anzuzeigen, wenn eine Übereinstimmung gefunden wird.

+0

hdk: Hinweis: Wenn Sie die 28 Byte _Following_, wo die 'Nadel' Bytes gefunden werden möchten, ändern Sie die Zeile 'hex_string = '' .join (r '\ x% 02X'% ord (b) für b im Heuhaufen [offset + nadel_len: offset + nadel_len + 28])'. – martineau

0

Wenn das, was Sie ändern möchten, das Display ist, dann müssen Sie die print Anweisung ändern. Wie von J-F Fabre erwähnt, müssen Sie die Suchzeichenfolge in ein Objekt bytes ändern, wenn Sie Python3 verwenden.

Für Python3:

needle = b"\x35\x5A\x3C\x2F\x74\x69\x6D\x65\x3E" 
... 
print ("%08X: "%i, ', '.join("%02X"%(ch) for ch in haystack[i:i+28])) 

Für Python2:

print ("%08X: "%i), ', '.join("%02X"%ord(ch) for ch in haystack[i:i+28]) 
Verwandte Themen