struct.error:在Python3.5中解压缩需要一个长度为16的字节对象

时间:2019-11-07 07:48:56

标签: python python-3.x

我有以下代码,正在尝试运行它。但是有一个错误。这是我正在使用的代码和文件。

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

请让我知道如何消除错误以及错过的内容。

1 个答案:

答案 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()。它将“起作用”(即不会引发异常),但是数据不是真正的文本行。