2015-05-06 101 views
1

嘗試從Lowe的Iris SmartSwitch解碼Zigbee協議。我正在使用的API回調接收一個已經被解析的框架,併發送給回調(我相信)一個字典對象(?)。我的代碼:python:打印十六進制數據而不是字典

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調用。

回答

2

任何方式使用Python內置函數,使用給定的'數據'參數來做到這一點?

號字典的任意訂製,所以沒有辦法知道什麼樣的順序值應該英寸

而且,我不知道如何解釋「\ RO」作爲8位十六進制。

它是「\ r」和「o」,它是0x0d 0x6f。

「\ t」,我假設是0x09。

>>> hex(ord('\t')) 
'0x9' 

我真的想爲數據幀的原始轉儲,但我不知道是否有一個API調用了點。

我們不知道,因爲您尚未共享您首先使用的API。

+0

+1了很完整的答案。您將無法使用該字典獲取數據幀的原始轉儲。 ZigBee協議將羣集ID以及源和目標端點組合在一起。檢查你的API,看看是否有另一個對象可以引用爲字節數組。 – tomlogic

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 ]) + '}' 
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),而不是打印...