【问题标题】:capturing data from clients as hex using twisted Python使用扭曲的 Python 从客户端捕获数据为十六进制
【发布时间】:2025-11-22 11:15:01
【问题描述】:

我需要编写连接了 100 多个客户端的服务器应用程序,这些客户端是嵌入式机器,每 2 分钟通过 tcp 套接字发送一些十六进制数据。之前我在 C# 中成功地编写了相同的代码,但现在我想使用 twisted 在 python 中编写相同的代码。由于我是 python 新手,我面临着某些问题。在 C# 中,我将来自客户端的数据直接存储在字节数组中,然后处理该字节数组。现在我想在 python 中做同样的事情,但我找不到怎么做?下面的代码只显示了 hex->ascii->char。

def rawDataReceived(self, data):
            print "hello"
            print data

我的问题如何将此数据转换为字节数组或直接将数据捕获为字节? 例如,客户端想要发送“w”字母,它将发送服务器 77 作为 1 个字节。我当前的代码显示 w 但如何将其转换为字节数组,例如 bytes[] array[0] = 0x77。

【问题讨论】:

  • 您只是想获取每个字节的数值?或者尝试构建一个 hexlified 字符串之类的?
  • 客户端将发送服务器 777777,我想将服务器应用程序编码为 byte[] araray = {0x77, 0x77, 0x77}。
  • 好吧,byte[] 不是 Python 类型,但 bytearray 非常接近您要查找的内容。此外,{} 用于 Python 中的(无序)集合,而不是(有序)序列。但我认为我的答案正是您想要的。
  • 请记住,“十六进制”只是字节的表示。 Python 内置字符串类型 (str) 是一个字节序列。使用字符串调用 dataReceived(/rawDataReceived) - 即使用字节。你已经有了你正在寻找的字节——真正的问题是你想用它们做什么。

标签: python sockets twisted


【解决方案1】:

要从 str 创建字节数组,请使用 bytearray:*

>>> data = 'hello'
>>> array = bytearray(data)
>>> array[0]
104
>>> hex(array[0])
0x68
>>> array[0] == 0x68
True

或者,您可以使用ord 将字符一一转换为字节:

>>> ord(data[0])
104

所以这些是等价的:

>>> list(bytearray(data)) == [ord(c) for c in data]
True

* 请注意,这里的文档有点混乱。他们说字符串需要编码,但这实际上只在 Python 3.x 中是正确的(这对于为 2.7 版明确编写的文档来说很奇怪)。在 2.x 中,str 符合缓冲区接口,因此不需要编码。

【讨论】:

  • 从这个问题来看,我不确定这是否会有所帮助。例如,考虑在您的示例中data[0] == '\x68' 的事实 - 那么对于张贴者遇到的任何问题,为什么字节数组(例如array[0] == 0x68)比 str 更好?由于他没有解释问题,所以很难说。 (换句话说,我想知道发帖人是否不只是对陈述感到困惑,而这些额外的信息可能只会让他更加困惑)
  • @Jean-PaulCalderone:他说他想要相当于 C# byte[]。这正是bytearray 的含义。此外,获取数字 0x68 而不是字符 '\x68' 似乎是他想要做的。
  • 是的 abarnet 是正确的我正在寻找将 0x68,0x77.. 作为数组元素。
  • 我不清楚这与 '\x68\x77...' 有何不同。但是,好吧!玩得开心。
  • 注意:b'hello'[0] == 104 在 Python 3 上,即 bytes“是”不可变的 bytearray
最近更新 更多