让我们把它分成几部分。
我有一个接收数据的套接字OK,我以\x31\x31\x31
格式得到它。
我知道我可以获得相同的号码,使用类似
的内容翻录\x
for i in data: print hex(ord(i))
所以我在每种情况下都得到31
。
但是如果我想在数据中添加1(因此它应该是“32 32 32
”)以将其作为回复发送,我该如何再次在\x32\x32\x32
中获取它?
答案 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)
我认为我坚持使用“> B”参数来构造,因为我使用了“h”和那个示例参数(在struct.pack上说新手!)
尝试编码/解码,但是另一侧的套接字将它们作为数字接收,而不是它想要的“\ x”表示。
我真的很喜欢%c格式的简单性,并且会将其用作时间性事物(我不会处理如此多的数据,所以没有理由成为超高效的atm:D)或者稍微使用它之后的结构体。 / p>
在示例中,要一次只使用一个字符,找到struct也工作,usint“> B”只能嘿嘿。
感谢所有人。