我有一个来自 PDU 编码的 SMS 的 GSM 日期/时间戳,它的格式是这样的
\x90,\x21,\x51,\x91,\x40,\x33
格式 yy,mm,dd,hh,mm,ss
我已将它们从二进制文件读入字节数组。我想将它们转换为字符串,但不进行任何解码,我想得到一个包含 902151914033 的字符串。然后我需要反转字符串中的每 2 个字符。
谁能给我一些指示?非常感谢
要转换为十六进制:
hexdata = ''.join('%02x' % ord(byte) for byte in bindata)
反转所有其他十六进制字符(如果我理解正确的话):
hexdata = ''.join(('%02x' % ord(byte))[::-1] for byte in bindata)
这应该让你开始:
>>> 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'
你的意思是你确实想做一些处理!未处理的字节最容易表示为字符。
我认为您想要的是以下内容:
r = ''
for num in array:
r += '%2X' % num
return r
如有必要,我确信可以将其包含在匿名函数中。
如果在您的问题中,您提供的字符串是包含 \ 和的字面字节集(ascii),并且您希望将它们剥离,您可以使用 binascii 模块和 str.replace:
import binascii
qp = binascii.b2a_qp( bunchabytes )
plainstring = qp.replace( '\\x', '' ).replace( ',', '' )
生成的纯字符串将仅包含数字。
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))