来自套接字、进程和响应的十六进制数据

2024-10-04 13:15:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我们把它分成几个部分。

我得到了一个socket,它接收数据,并且是\x31\x31\x31格式的。

我知道我可以得到相同的号码,用类似的东西撕开\x

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

所以在每一种情况下我都得到了31

但是如果我想在数据中添加1(所以应该是“32 32 32”)作为响应发送它,我如何才能再次将它放入\x32\x32\x32


Tags: 数据infordata格式情况socket号码
3条回答

与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'

使用struct模块

解包并获取abc中的3个值

(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文档中的struct模块

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

要将它转换回字符串中的二进制数据,如果它只在一个整数上,则可以使用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。

相关问题 更多 >