【问题标题】:python: print hex data instead of dictionarypython:打印十六进制数据而不是字典
【发布时间】:2015-05-06 16:56:06
【问题描述】:

试图从 Lowe's 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 调用。

【问题讨论】:

    标签: python zigbee hexdump


    【解决方案1】:

    有什么方法可以使用 Python 内置函数,使用给定的“数据”参数?

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

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

    是“\r”和“o”,即0x0d 0x6f。

    “\t”,我假设,是 0x09。

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

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

    我们不知道,因为您一开始并没有分享您使用的 API。

    【讨论】:

    • +1 以获得非常完整的答案。您将无法使用该字典获取数据框的原始转储。 ZigBee 协议将集群 ID 以及源端点和目标端点组合在一起。检查您的 API,看看是否有另一个对象可以作为字节数组引用。
    【解决方案2】:

    如果没有空格也可以,请尝试字符串上的内置 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 ] ) + '}' 
    

    【讨论】:

      【解决方案3】:

      这行得通:

      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...

      【讨论】:

        猜你喜欢
        • 2013-03-31
        • 2018-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多