2024-10-04 13:15:05 发布
网友
我们把它分成几个部分。
我得到了一个socket,它接收数据,并且是\x31\x31\x31格式的。
\x31\x31\x31
我知道我可以得到相同的号码,用类似的东西撕开\x
\x
for i in data: print hex(ord(i))
所以在每一种情况下我都得到了31。
31
但是如果我想在数据中添加1(所以应该是“32 32 32”)作为响应发送它,我如何才能再次将它放入\x32\x32\x32?
32 32 32
\x32\x32\x32
与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。
与ord()相反的是chr()。
所以你可以在上面加一个:
要在示例中使用它:
但是如果您真的想使用十六进制字符串,可以使用encode()和decode():
使用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格式字符:
然而,更好的方法可能是使用struct。
你甚至可能想看看ctypes。
相关问题 更多 >
编程相关推荐