以下是我通过套接字接收数据的代码。
from twisted.internet.protocol import Factory
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor
class Chat(LineReceiver):
def lineReceived(self, line):
print(line)
class ChatFactory(Factory):
def __init__(self):
self.users = {} # maps user names to Chat instances
def buildProtocol(self, addr):
return Chat()
reactor.listenTCP(9600,ChatFactory())
reactor.run()
我收到了客户的回复
b'$$\x00pP$\x91\x97\x01\xff\xff\x99\x99P000002.000,V,0000.0000,N,00000.0000,E,0.00,000.00,060180,,*09|||0000|0000,0000|000000113|00000[\x86'
是十六进制代码和ascii的组合,位置信息采用ascii格式。 将此数据转换为人类可读格式的最佳方法是什么?
我需要解析标题,L和ID 。
<$$><L><ID><command><data><checksum><\r\n>
0x24
提前致谢。
答案 0 :(得分:1)
这可以通过二进制字符串来解决:
import struct
header = line[:2]
if header!=b'$$':
raise RuntimeError('Wrong header')
# Assumes you want two have 2 bytes, not one word
L = struct.unpack('BB',line[2:4])
ID = struct.unpack('7B', line[4:11])
location = line[11:]
print 'L={},{}, ID={}, location={}'.format(L[1],L[2], ''.join(str(b) for b in ID, location)
结构的链接在另一个答案中
答案 1 :(得分:-1)
您可以使用struct.unpack()
,但您必须知道要解压缩的内容(int,long,signed等),如果编码超过1个字节,则为7,ASCII为7位,以1个字节编码。
阅读有关struct here的更多信息。