如何在python中将二进制和ascii的组合转换为人类可读的格式

时间:2016-07-01 12:27:14

标签: python twisted

以下是我通过套接字接收数据的代码。

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>
  • header = 2个字节,它将以0x24
  • 的十六进制代码表示
  • L = 2个字节,格式为十六进制代码。
  • ID = 7个字节,格式为十六进制代码。
  • command = 2个字节,它将是十六进制代码
  • 数据将采用ascii格式。
  • checksum = 2个字节,以十六进制代码

提前致谢。

2 个答案:

答案 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的更多信息。