python:打印十六进制数据而不是字典

时间:2015-05-06 16:56:07

标签: python zigbee hexdump

尝试从Lowe的Iris SmartSwitch解码Zigbee协议。我正在使用的API回调接收已经解析的帧,并作为(我相信)字典对象(?)发送到回调。我的代码:

def callback(data):
    print data

打印以下内容:

{'profile': '\xc2\x16', 'source_addr': '\x93\x0c', 'dest_endpoint':
 '\x02', 'rf_data': '\t\x00\x81\x00\x00', 'source_endpoint': '\x02',
 'options': '\x01', 'source_addr_long': '\x00\ro\x00\x03\xbc\xdf\xab',
'cluster': '\x00\xef', 'id': 'rx_explicit'}

我认为这是按字节顺序排列的,我更喜欢输出:

C2 16 93 0C 02 09 00 81 00 00 02 01 00 ...

任何使用Python内置函数的方法,使用给定的数据'争论?另外,我不知道如何解释" \ ro"作为8位十六进制。 " \ t",我认为是0x09。

我真正想要的是数据帧的原始转储,但我不知道是否有API调用。

3 个答案:

答案 0 :(得分:2)

  

任何使用Python内置函数的方法,使用给定的数据'参数

没有。字典是任意排序的,因此无法知道值应该是什么顺序。

  

另外,我不知道如何解释" \ ro"为8位十六进制。

它" \ r"和" o",这是0x0d 0x6f。

  

" \ t",我认为是0x09。

ParseExact
  

我真正想要的是数据帧的原始转储,但我不知道是否有API调用。

我们不知道,因为您还没有分享您首先使用的API。

答案 1 :(得分:0)

如果您没有空格,请尝试使用字符串内置的encode方法。

所以'\x0a\x0b\x0c'.encode('hex')会产生'0a0b0c'。有许多是你可以迭代字典值,但要注意它是一个固有的无序数据结构。

也许这样的事情可以吗?

data = {'a':'\x0a\x0a\x0a', 'b':'\x0b\x0b\x0b'}
print '{' + ''.join( [ ('\'%s\'' %k) + ': \'%s\',' %data[k].encode('hex') for k in data ] ) + '}' 

答案 2 :(得分:0)

这有效:

def printData(data)
    str = "> "
    for d in data:
        for e in data[d]:
            str = str + "{0:02X}".format(ord(e)) + " "
    print (str)

我使用此字符串构建器,因此我可以使用logging.info(str)而不是print ...