我具有從PDU編碼SMS一個GSM日期/時間戳它被格式化爲這樣將字節數組轉換爲字符串而不解釋字節?
\ X90,\ X21,\ X51,\ X91,\ X40,\ X33
格式YY,毫米, dd,hh,mm,ss
我已經將它們從二進制文件讀入字節數組中。我想將它們轉換爲一個字符串,但是沒有做任何解碼,我想以一個包含902151914033的字符串結尾。然後我需要反轉字符串中的每個2個字符。
任何人都可以給我一些指針嗎? 很多謝謝
我具有從PDU編碼SMS一個GSM日期/時間戳它被格式化爲這樣將字節數組轉換爲字符串而不解釋字節?
\ X90,\ X21,\ X51,\ X91,\ X40,\ X33
格式YY,毫米, dd,hh,mm,ss
我已經將它們從二進制文件讀入字節數組中。我想將它們轉換爲一個字符串,但是沒有做任何解碼,我想以一個包含902151914033的字符串結尾。然後我需要反轉字符串中的每個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'
要轉換爲十六進制:
hexdata = ''.join('%02x' % ord(byte) for byte in bindata)
爲了扭轉每隔十六進制字符(如果我理解正確):
hexdata = ''.join(('%02x' % ord(byte))[::-1] for byte in bindata)
最新的Python有一個更好的(IMO)字符串格式:http://www.python.org/dev/peps/pep-3101/ – 2009-12-16 19:45:13
@lpthnc:味道的問題,真的。儘可能保持簡單和可讀性:-) – RedGlyph 2009-12-16 19:46:53
如果在你身上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))
因此,在您的輸入中,0x90或'\ x90'代表年份(20)09,0x21代表月份12,0x51代表第15天等等。什麼聰明的想法設計了編碼方案? – 2009-12-16 21:53:14