【问题标题】:python integer format conversionpython整数格式转换
【发布时间】:2021-02-15 04:20:07
【问题描述】:

我需要一个可以执行以下操作的应用程序:

  1. 读取 UDP 消息,从中获取数据 - 数据是文本的,逗号分隔。
  2. 根据此值构建新消息
  3. 向其他目的地发送新的 UDP 消息。

第一次和最后一次我都很好。第二个我有一个挑战: 假设我收到的数据是Year = 2020。 Wireshark 上的消息(第 3 步),我将其视为 2 个字节,值 07 e4

我该怎么做?我尝试了几种方法,但都没有为我提供所需的格式。

代码示例:

data1 = '\xab\xcd\xef\xgh'
...
data, addr = sock.recvfrom (200)
elements = data.decode().split(",")
Date=elements[15].split("/")
Year = int(Date(2))
year = <do something with Year to convert to right format>
newMsg = data1 + year
...
newSock.sendto(newMsg.encode('charmap'), (IP, int(port)))

Python 3.5 版

【问题讨论】:

  • 这能回答你的问题吗? stackoverflow.com/questions/2269827/…
  • 看看struct,它为这些类型的消息编写提供了有用的功能,例如struct.pack('!h', 2020)
  • @go2nirvana - 没有。假设整数小于 255。我需要大于该值的值
  • @MrFuppes,如前所述,原始值是文本,逗号分隔,其中包括日期和时间(aa:bb:cc.dd, XX/YY/ZZ) - 我需要提取每个这些值并重建一个包含附加数据的新数据包。此数据存储为字符串
  • @user1977050 没有这样的假设。您可以使用hex 将任何整数转换为十六进制。

标签: python python-3.x format udp


【解决方案1】:

这里似乎有几个问题。首先,如果您的 data1 真的应该是原始字节,那么您最好通过在其前面加上 b 前缀来声明它,例如:

data1 = b'\xab\xcd\xef\xff'

如果它来自其他地方,则将其适当地编码为bytes

为了回答您的主要问题,struct 模块提供了有用的工具,可以按照您想要的方式将数字编码为字节。 ctypes 也很有用,但 struct 往往更容易用于这些事情:

data, addr = sock.recvfrom (200)
elements = data.decode().split(",")
date = elements[15].split("/")
year = int(date(2))
newMsg = data1 + struct.pack('!h', year)

然后你可以发送它:

newSock.sendto(newMsg, (IP, int(port)))

【讨论】:

  • 2 个问题:A. 我还有一个名为 Month 的变量。当我尝试执行打包时,它会附加 2 个字节而不是单个字节。如何解决? B. 我需要计算消息的校验和。我试过 sum (newMsg) 但它需要 int 类型
  • 一个。阅读struct 的文档以了解如何打包一个字节。湾。校验和本身就是一个很大的主题,大多与数值求和无关。我建议搜索执行类似操作的现有代码
  • 一个。刚刚解决了。湾。 - 以前我有 s=0 for k in newMsg: sum+=ord(k) 到现在我该怎么改?
  • list(b'abc') 的计算结果与 [ord(k) for k in 'abc'] 相同
猜你喜欢
  • 2015-12-14
  • 2023-03-26
  • 2021-03-22
  • 2018-08-12
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2014-11-15
  • 2012-05-19
相关资源
最近更新 更多