【问题标题】:Why do ints have different hex values in python 3?为什么整数在 python 3 中有不同的十六进制值?
【发布时间】:2019-07-30 01:06:51
【问题描述】:

我正在将一些代码从 python 2.7 转换为 python 3,并且遇到了十六进制整数的问题。

    value = 0x11
    hexdump(value)
python2 output: 11
python3 output: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

这个 hexdump 函数来自 scapy,并已用于我所有其他的十六进制故障排除。执行 chr(0x11) 会产生预期值,但如果不是 int 类型,许多 scapy 函数会被调用崩溃。

我需要一种方法来获取 11 作为 int 类型的十六进制数据。我尝试使用

更改类型
    int(value,16) #also tried 0 and 10

这个问题是我得到 ValueError: invalid literal for int() with base 10: '\x11'

【问题讨论】:

  • print(type(0x11)) 这表明0x11int
  • chr(0x11) 转换为带有一个字符的字符串,其代码为 x11,但由于此代码没有字体,因此 Python 将其显示为 \x11。但是 Python 不会将其视为具有四个字符的字符串(两位数 1),并且您不能将其转换为整数使用 int()ord('\x11') 给出整数 17 - 在十六进制中它是 11。

标签: python python-3.x hex scapy


【解决方案1】:

0x11 在 python2 和 python3 中都是一个 int。也许你的hexdump 函数中有一些字符串处理出错了? python3中的字符串非常不同。

你能把hexdump()的代码贴出来吗?

根据@Cukic0d 下面的评论,如果您的hexbytes() 实际上想要一个字节数组,这应该可以工作:hexdump(bytes([value])) -- 将包含值的长度为 1 的整数数组转换为 bytes 对象并将其传递给hexdump

【讨论】:

  • 正确。 hexdump 将 Scapy 数据包或字节作为输入
  • hexdump 是一个 scapy 函数,它只打印出值,我用它来检查我是否正在获取写入的十六进制数据。这是带有 hexdump 函数github.com/secdev/scapy/blob/master/scapy/utils.py 的文档的链接,如果我像你说的那样转换为字符串或字节,我能够获得正确的十六进制数据,但由于其他依赖关系,我需要我的值是 int 类型。跨度>
  • 查看该代码,hexdump 在其输入上调用 bytes_encode(),期望它是某种类型的序列,所以我很确定该代码在传递时无法工作单个整数。还有什么其他依赖项要求您将原始数据传递给hexdump
  • 你是对的 hexdump 在打印 int 时遇到问题(仅在 python3 中)。相反,我使用了 print(hex(int))。原来对于这种情况,我只需要将另一行从 str 更改为 chr
猜你喜欢
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 2018-08-09
  • 1970-01-01
  • 2020-04-01
  • 2019-07-15
相关资源
最近更新 更多