我正在编写一个python脚本,它查看常见的计算机文件并检查它们是否有类似的字节,单词,双字。虽然我需要/想要查看Hex中的文件,但是ande似乎无法让python在python中打开一个简单的文件。我已经尝试使用hexc作为编码的codecs.open,但是当我操作文件描述符时它总是吐回来
File "main.py", line 41, in <module>
main()
File "main.py", line 38, in main
process_file(sys.argv[1])
File "main.py", line 27, in process_file
seeker(line.rstrip("\n"))
File "main.py", line 15, in seeker
for unit in f.read(2):
File "/usr/lib/python2.6/codecs.py", line 666, in read
return self.reader.read(size)
File "/usr/lib/python2.6/codecs.py", line 472, in read
newchars, decodedbytes = self.decode(data, self.errors)
File "/usr/lib/python2.6/encodings/hex_codec.py", line 50, in decode
return hex_decode(input,errors)
File "/usr/lib/python2.6/encodings/hex_codec.py", line 42, in hex_decode
output = binascii.a2b_hex(input)
TypeError: Non-hexadecimal digit found
def seeker(_file):
f = codecs.open(_file, "rb", "hex")
for LINE in f.read():
print LINE
f.close()
我真的只是想查看文件,并对它们进行操作,就好像它是在像xxd这样的十六进制编辑器中。也可以一次以一个字的增量读取文件。
不,这不是功课。
答案 0 :(得分:4)
codecs.open(_file, "rb", "hex")
正在尝试将文件的内容解码为十六进制,这就是为什么它失败了。
考虑到你的另一个“一次一个字”目标(我假设你的意思是“计算机字”,即32位?),你最好将打开的文件封装到你自己的类中。 E.g:
class HexFile(object):
def __init__(self, fp, wordsize=4):
self.fp = fp
self.ws = wordsize
def __iter__(self):
while True:
data = self.fp.read(self.ws)
if not data: break
yield data.encode('hex')
加上你会发现有用的其他任何实用方法,当然。
答案 1 :(得分:1)
您可以通过将整数参数传递给read
来读取一定数量的字节:
32bits = file.read(4)
您可以使用seek
:
file.seek(100) # Seeks to byte 100
答案 2 :(得分:1)
如果这会更清楚......: def hexfile(file_path): FP =开放(FILE_PATH) 而真: data = fp.read(4) 如果没有数据:休息 print data.encode('hex')
file_path类似于“C:/somedir/filename.ext” 它很好的方法顺便说一下它对我来说很好用。 :)