套接字,进程和响应的十六进制数据

时间:2009-06-30 13:45:39

标签: python sockets hex

让我们把它分成几部分。

我有一个接收数据的套接字OK,我以\x31\x31\x31格式得到它。

我知道我可以获得相同的号码,使用类似

的内容翻录\x
for i in data: print hex(ord(i))

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

但是如果我想在数据中添加1(因此它应该是“32 32 32”)以将其作为回复发送,我该如何再次在\x32\x32\x32中获取它?

4 个答案:

答案 0 :(得分:4)

使用struct module

解压缩并获取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模块

答案 1 :(得分:4)

“\ 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。

答案 2 :(得分: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'

答案 3 :(得分:0)

OMG,快点回答! :d

我认为我坚持使用“> B”参数来构造,因为我使用了“h”和那个示例参数(在struct.pack上说新手!)

尝试编码/解码,但是另一侧的套接字将它们作为数字接收,而不是它想要的“\ x”表示。

我真的很喜欢%c格式的简单性,并且会将其用作时间性事物(我不会处理如此多的数据,所以没有理由成为超高效的atm:D)或者稍微使用它之后的结构体。 / p>

在示例中,要一次只使用一个字符,找到struct也工作,usint“> B”只能嘿嘿。

感谢所有人。