我有以下代码,正在尝试运行它。但是有一个错误。这是我正在使用的代码和文件。
import sys
import re
import subprocess as commands
import struct
class rbin:
def file_op(self,rfile):
self.readfile = rfile
self.wfile = open('loadmem.txt', 'w')
for line in self.readfile.readlines():
for cnt in range (0,4096,1):
x = cnt*16
test = line[x:x+16]
if (len(test) == 14):
magic = struct.unpack("<14b",test)
for i in range(0,14,1):
self.wfile.write("0x%X\n" % (magic[i]))
else:
magic = struct.unpack("<16b",test)
for i in range(0,16,1):
if ((x <= 498) | ((x <= 65520) & (x >= 65280))):
self.wfile.write("0x%X\n" % (magic[i]))
self.readfile.close()
self.wfile.close()
# Call Class
T = rbin()
# Call function from class
T.file_op(open('1.ex5','rb'))
错误是:
Traceback (most recent call last):
File "check.py", line 30, in <module>
T.file_op(open('1.ex5','rb'))
File "check.py", line 19, in file_op
magic = struct.unpack("<3b",test)
struct.error: unpack requires a bytes object of length 3
文件为:1.ex5
请让我知道如何消除错误以及错过的内容。
答案 0 :(得分:0)
每次调用readlines()都会从文件的当前位置到下一个\ n(0x0a)字符产生数据。现在,由于这实际上是一个二进制文件,因此实际上没有“换行”的概念。
如果您在十六进制编辑器中打开文件,则会看到类似以下内容的东西:
00000d70: 4451 baf1 dab3 7f69 ba67 a75b 1dee e6c2 DQ.....i.g.[....
00000d80: c816 a6cf be27 ace2 e6bb efef 0578 9a50 .....'.......x.P
00000d90: 0a86 28b8 1cae e9b4 e5ff ac5c e664 170a ..(........\.d..
^ ^
fake linefeed another fake linefeed
在文件的该特定部分中,少于16个字节,这就是为什么您尝试struct.unpack
16个字节失败的原因。
道德:不要在二进制文件上运行readlines()。它将“起作用”(即不会引发异常),但是数据不是真正的文本行。