Python struct.error:结构格式中的错误字符

2024-02-19

首先我想知道这个python语句的作用:

struct.unpack("!%sH" % (len(data) / 2), data))

其次,我必须使用 python 发出 ICMP 请求消息,问题是我已经得到了老师给我的一些帮助代码:

def step4(code, server, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname('icmp'))

    CHARMAP = nonprintable_to_dots()

    packet = create_packet(int(code))

    s.sendto(packet, (server, port))

    while True:
        msg = s.recv(1600)

        if not msg:
            break

        ihl = (ord(msg[0]) & 0x0F) * 4
        icmp = msg[ihl:]

        hexdump(icmp, True)

        if cksum(icmp[:]) != 0:
            print("wrong ckecksum!!")

def nonprintable_to_dots():
    return str.join('', [c if c in printable[:-5] else '.' for c in map(chr, range(256))])

def hexdump(frame, with_time=False):
    def to_chr(bytes):
        retval = bytes.translate(CHARMAP)
        return retval[:8] + ' ' + retval[8:]

    def to_hex(bytes):
        retval = str.join(' ', ["%02X" % ord(x) for x in bytes])
        return retval[:23] + ' ' + retval[23:]

    if with_time:
        print('--' + time.strftime("%H:%M:%s"))

    for i in range(0, len(frame), 16):
        line = frame[i:i + 16]
        print('%04X  %-49s |%-17s|' % (i, to_hex(line), to_chr(line)))

    print

def cksum(data):

    def sum16(data):
        "sum all the the 16-bit words in data"
        if len(data) % 2:
            data += '\0'

        return sum(struct.unpack("!%sH" % (len(data) / 2), data))

    retval = sum16(data)                       # sum
    retval = sum16(struct.pack('!L', retval))  # one's complement sum
    retval = (retval & 0xFFFF) ^ 0xFFFF        # one's complement

    return retval

问题是,理论上所有这些代码都是正确的,所以我只应该执行“create_packet”函数,我将其包含在此处:

def create_packet(code):
    ICMP_REQUEST = 8
    checksum = 0
    identifier = 7
    sequence_number = 7

    message_header = struct.pack("!BBHHH", ICMP_REQUEST, 0, checksum, identifier, sequence_number)

    message_payload = struct.pack("!I", code)

    checksum = cksum(message_header + message_payload)

    message_header = struct.pack("!BBHHH", ICMP_REQUEST, 0, checksum, identifier, sequence_number)

    return message_header + message_payload

每当我执行脚本时,我总是会收到此错误:

Traceback (most recent call last):
    File "gymkhana.py", line 256, in <module>
        main()                                                                                                                
    File "gymkhana.py", line 19, in main
        step4(identifier, server, ginkana_port)
    File "gymkhana.py", line 181, in step4
        packet = create_packet(int(code))
    File "gymkhana.py", line 211, in create_packet
        checksum = cksum(message_header + message_payload)
    File "gymkhana.py", line 248, in cksum
        retval = sum16(data)                       # sum
    File "gymkhana.py", line 246, in sum16
        return sum(struct.unpack("!%sH" % (len(data) / 2), data))                                                           
struct.error: bad char in struct format

作为第一个问题的答案,这一行

struct.unpack("!%sH" % (len(data) / 2), data)    # in Python 2
struct.unpack("!%sH" % (len(data) // 2), data)   # in Python 3

说,采取n字节数data (example:4字节)并将它们解释为n/2 个无符号短整数 (example:2 个整数),每个 2 个字节。这!开头是关于字节顺序的,表示大端字节序。%s根据值转换为一位或多位数字len(data) / 2,所以在示例中,它与执行相同

struct.unpack("!2H", data)

Your bad char in struct format例外是因为您提供的代码使用/除法运算符。这在 Python 2 中是有效的。但在 Python 3 中它需要是//。那是因为/在Python 2中表示整数除法,但在Python 3中表示浮点除法。所以在Python 3中,

"!%sH" % (len(data) / 2)

出来为

struct.unpack("!2.0H", data)

这解释了你的bad char error.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python struct.error:结构格式中的错误字符 的相关文章

随机推荐

  • PHP curl FTPes w/显式 TLS/SSL

    我一直在尝试使用显式 TLS SSL 服务器推送到远程 FTP 但连接始终超时 它正在连接 但我不知道它在哪里停止 但我假设它与 FTP TLS SSL 控制通道有关 任何帮助将不胜感激 通过 FileZilla 我可以毫无问题地进行连接
  • 将 Groovy 应用程序和测试代码与 jlink 解决方案结合使用来捆绑 JavaFX

    这是继这个优秀的解决方案 https stackoverflow com a 58541585 595305如何让 Gradle 将 JavaFX 与您的发行版捆绑在一起的问题 注意规格 Linux Mint 18 3 Java 11 Ja
  • 如何在构建服务器上使用“firebase login:ci”

    我正在使用以下命令运行nodejs构建Github 工作流程 https help github com en actions automating your workflow with github actions configuring
  • 将实际值从 fortran77 dll 返回到 c#

    有人可以指出我在这里做错了什么吗 FORTRAN 77 dll 代码 pragma aux DON DON export parm value 8 value 8 SUBROUTINE DON DAA DBB DCC REAL 8 DAA
  • Javascript:将 OOP 方法附加到事件和“this”关键字

    我是 OOP Javascript 新手 并且在使用时遇到问题this关键字和事件 我想要实现的是 我有多个 DOM 对象 并且不仅希望将公共事件绑定到它们 还希望将有关上述对象的一些数据保留在全局容器中 以提高运行时性能 所以我所做的基本
  • 为什么使用 scanf 读入字符串缓冲区可以在有或没有与号 (&) 的情况下工作?

    我对某事有点困惑 我的印象是读取 C 字符串的正确方法是scanf 沿着 不用担心可能的缓冲区溢出 这只是一个简单的例子 char string 256 scanf s string 然而 以下似乎也有效 scanf s string 这只
  • 比较 Excel 工作簿中两个工作表的最佳方法是什么

    鉴于我有以下内容
  • 为什么要使用字段而不是属性?

    我对 C 还很陌生 我认为属性是一件很棒的事情 事实上 这太棒了 以至于我看不出使用字段有任何真正的优势 即使对于私人领域 属性提供的灵活性和模块化似乎充其量可以让您避免严重的头痛 而最坏的情况则根本没有任何效果 我看到的字段的唯一优点是您
  • 将 iPhone X 旋转至横向时,封面图像左侧和下方出现空白

    今天出现了一个奇怪的问题 在测试一个简单的 即将推出 页面时 我的 iPhone X 上的背景图像在旋转到横向时没有填充整个视口 在 Chrome 和 Safari 中测试 产生问题的简化示例 html background url htt
  • 如何使这些按钮不显示为蓝色链接

    所以我只是想创建一个小网站 别担心这不会发生 作为标题 目前 主页 新闻 图库 和 关于我们 并不是指向另一个页面的实际按钮 当我做 a href Mainpage htm Home a 该按钮变成紫色并带有下划线 我知道这就是链接的显示方
  • 实体框架一对零或一外键关联

    我正在更改现有应用程序的后端以使用实体框架代码优先 我使用 Visual Studio 2015 中的内置工具根据现有数据库生成 POCO 类 这在大多数情况下都非常有效 除了两个具有一对零或一关系的类之外 这些是我的 简化的 课程 pub
  • 在 Shiny 中获取响应头变量

    我的 apache 将 LDAP 登录传递给变量X 远程用户在标题中 但我不知道如何在 Shiny 应用程序中获取它 有任何想法吗 也许解决方案可以是一些java脚本 好吧 我解决了 首先包含在ui Rjs函数 www js getLogi
  • Elasticsearch 自动完成或按令牌自动建议

    我想就如何基于标记完成术语提出建议 类似于谷歌的自动完成功能 但仅使用一个标记或单词 我想搜索将被标记化的文件名 例如 BRAND Connect A1233 jpg 被标记为 brand connect a1234 和 jpg 现在我想征
  • 如何在 Visual Studio 中搜索特定数据库表

    我在 Visual Studio 中有 6 个 dtsx 设计 文件 作业步骤 大多数情况下 作业步骤运行 sql 代码并删除 创建 复制表 如何搜索某个特定表格被触摸的位置 我尝试了 control F 并浏览了菜单中的搜索选项 我不认为
  • DataGridRow 上的 WPF DataGrid MouseOver

    我不明白为什么代码的第一部分不起作用 但第二部分却起作用 PART 1
  • 数据帧中值对出现的次数

    我有包含以下列的数据框 Name Surname dateOfBirth city country 我有兴趣找出最常见的名字和姓氏组合以及它出现的频率 如果能看到前 10 名组合的列表就好了 我对第一名的想法是 mostFreqComb d
  • AWS Lambda Java函数被多次调用

    我有一个AWS我用 Java 编写的 Lambda 函数 实际上是用 Clojure 编写的 每次运行它时它似乎都会被调用 3 次 我的函数在超时 设置为最长 5 分钟 内成功运行 它返回一个字符串 当我在控制台中测试该函数时 我可以看到输
  • 这是初始化 [ThreadStatic] 的线程安全方法吗?

    ThreadStatic private static Foo foo public static Foo CurrentFoo get if foo null foo new Foo return foo 前面的代码线程安全吗 或者我们需
  • 多核 CPU 中的核之间/跨核访问寄存器

    这可能听起来很疯狂 但我似乎不清楚是否有一个接口可供汇编程序员编写代码将内核 1 上的一个寄存器加载到内核 2 上的寄存器 例如 将内核 1 上的 EAX 加载到内核 2 上的 EAX 有可能吗 更多关于汇编程序员使用两个核心 在多个核心上
  • Python struct.error:结构格式中的错误字符

    首先我想知道这个python语句的作用 struct unpack sH len data 2 data 其次 我必须使用 python 发出 ICMP 请求消息 问题是我已经得到了老师给我的一些帮助代码 def step4 code se