【问题标题】:convert byte array to string without interpreting the bytes?将字节数组转换为字符串而不解释字节?
【发布时间】:2010-12-27 09:05:41
【问题描述】:

我有一个来自 PDU 编码的 SMS 的 GSM 日期/时间戳,它的格式是这样的

\x90,\x21,\x51,\x91,\x40,\x33

格式 yy,mm,dd,hh,mm,ss

我已将它们从二进制文件读入字节数组。我想将它们转换为字符串,但不进行任何解码,我想得到一个包含 902151914033 的字符串。然后我需要反转字符串中的每 2 个字符。

谁能给我一些建议? 非常感谢

【问题讨论】:

  • 所以在您的输入中,0x90 或 '\x90' 代表年 (20)09,0x21 代表第 12 个月,0x51 代表第 15 天,等等???哪个聪明人设计了这种编码方案?

标签: python bytearray decode


【解决方案1】:

转换为十六进制:

hexdata = ''.join('%02x' % ord(byte) for byte in bindata)

反转所有其他十六进制字符(如果我理解正确的话):

hexdata = ''.join(('%02x' % ord(byte))[::-1] for byte in bindata)

【讨论】:

  • 最新的 Python 有更好的 (IMO) 字符串格式:python.org/dev/peps/pep-3101
  • @lpthnc:口味问题,真的。让它尽可能简单易读:-)
【解决方案2】:

这应该让你开始:

>>> s = b'\x90\x21\x51\x91\x40\x33'
>>> lst = [hex(z)[2:] for z in s]
>>> lst
['90', '21', '51', '91', '40', '33']

>>> string = ''.join(hex(z)[3:1:-1] for z in s)
>>> string
'091215190433'

【讨论】:

    【解决方案3】:

    你的意思是你确实想要做一些处理!未处理的字节最容易表示为字符。

    我认为您想要的是以下内容:

    r = ''
    for num in array:
        r += '%2X' % num
    return r
    

    如有必要,我确信可以将其封装在匿名函数中。

    【讨论】:

    • @Autopulated:修正了您对第一个问题的回答,'\x90'chr(0x90) 而不是 chr(90)。不过 LC 解决方案更好。
    【解决方案4】:

    如果在您的问题中,您提供的字符串是包含 \ 和的字面字节集(ascii),并且您希望将它们剥离,您可以使用 binascii 模块和 str.replace:

    import binascii
    qp = binascii.b2a_qp( bunchabytes )
    plainstring = qp.replace( '\\x', '' ).replace( ',', '' )
    

    生成的纯字符串将仅包含数字。

    【讨论】:

      【解决方案5】:
      switcher= dict(
          (n1*16 + n2, n2*16 + n1)
          for n1 in range(16)
          for n2 in range(16)
      )
      
      def nibble_switcher(bindata):
          return type(bindata)(switcher[i] for i in bindata)
          # will work with many types, not only bytearray
      
      def nibble_switcher_as_hex_string(bindata):
          return ''.join("%02x" % i for i in nibble_switcher(bindata))
      

      【讨论】:

        猜你喜欢
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多