繁体   English   中英

struct.error: 在 Python3.5 中解包需要长度为 16 的字节 object

[英]struct.error: unpack requires a bytes object of length 16 in Python3.5

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

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

请让我知道如何消除错误以及我错过了什么。

每次调用 readlines() 都会为您生成从文件中当前 position 到下一个 \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()。 它会“工作”(即不会抛出异常),但数据并不是真正的文本行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM