来自套接字的十六进制数据,处理和响应

0 投票
4 回答
6400 浏览
提问于 2025-04-15 12:36

我们把问题分开来看。

我有一个套接字(socket),可以正常接收数据,数据格式是 \x31\x31\x31

我知道我可以通过去掉 \x 来得到相同的数字,比如用下面的代码:

for i in data: print hex(ord(i))

这样我就得到了每个部分的 31

但是如果我想在这个数据上加1(这样它就变成 "32 32 32"),然后再以 \x32\x32\x32 的格式发送回去,我该怎么做呢?

4 个回答

0

ord() 的反义词是 chr()。

所以你可以这样做来给它加一:

newchar = chr(ord(i) + 1)

在你的例子中使用这个:

newdata = ''

for i in data:
   newdata += chr(ord(i) + 1)

print repr(newdata)

不过如果你真的想用十六进制字符串,可以使用 encode() 和 decode():

>>> 'test string'.encode('hex')
'7465737420737472696e67'
>>> '7465737420737472696e67'.decode('hex')
'test string'
4

使用结构模块

解包并获取abc中的三个值

(a, b, c) = struct.unpack(">BBB", your_string)

然后

a, b, c = a+1, b+1, c+1

再把它们打包成响应

response = struct.pack(">BBB", a, b, c)

想了解更多细节,可以查看Python文档中的结构模块

4

“\x31” 不是一种格式,而是二进制数据的文本表示。正如你提到的,ord() 函数可以把一个字节的二进制数据转换成一个整数,这样你就可以对它进行数学运算。

如果你想把它转换回字符串中的二进制数据,可以使用 chr() 函数,前提是你只处理一个整数。如果有很多整数,可以使用字符串的 %c 格式化字符:

>>> "Return value: %c%c%c" % (5,6,7)
'Return value: \x05\x06\x07'

不过,使用 struct 可能是更好的方法。

>>> import struct
>>> foo, bar, kaka = struct.unpack("BBB", '\x06\x06\x06')
>>> struct.pack("BBB", foo, bar+1, kaka+5)
'\x06\x07\x0b'

你甚至可以看看 ctypes。

撰写回答