PDU でエンコードされた SMS からの GSM 日付/タイム スタンプを持っています。
\x90、\x21、\x51、\x91、\x40、\x33
フォーマット yy,mm,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'
16 進数に変換するには:
hexdata = ''.join('%02x' % ord(byte) for byte in bindata)
他のすべての16進文字を逆にするには(私が正しく理解している場合):
hexdata = ''.join(('%02x' % ord(byte))[::-1] for byte in bindata)
あなたが意味するのは、あなたが何らかの処理をしたいということです!未処理のバイトは、最も簡単に文字として表されます。
私はあなたが望むものは次のようなものだと思います:
r = ''
for num in array:
r += '%2X' % num
return r
必要に応じて、匿名関数にまとめることができると確信しています。
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))
あなたの質問で、あなたが提供した文字列が \ と を含むバイトのリテラル セット (ascii として) であり、それらを取り除きたい場合は、binascii モジュールと str.replace を使用できます。
import binascii
qp = binascii.b2a_qp( bunchabytes )
plainstring = qp.replace( '\\x', '' ).replace( ',', '' )
結果のプレーンストリングは、数字のみで構成されます。