Pythonバイト列を整数に変換
2274 ワード
需要:下位機はイーサネットを通じてPython上位機にデータデータを送信し、上位機はbytesタイプのデータとして表示され、以下の通りである.
b'$\xca\x9a;33DDUUffww
このバイト列を数値に変換する必要があります.
この中には16進数のデータが混ざっていて、ASCIIコードもあります.なぜ転送されるバイト列に混在する場合があるのでしょうか.
理由は次のとおりです.
バイト列は何ですか.バイナリの符号化されていないバイト(1 Byte)の山で、何も表示されません.1バイトに8 bitがあるので、バイトは数字で表すことができます.バイナリを用いて明らかに長すぎることを表すが、一般的には2桁の16進数で表されるが、バイト列と文字列の本質は対応する関係であるため、pythonにおけるバイト列の操作は文字列とほぼ同じである.
16進数の上位128(0 x 00~0 x 80)の個数はASCIIと一対一の関係にあるため、pythonではバイト列を表すときに16進数とASCIIコードが混在する場合がある.次のようになります.
>>> b'\x25\x90\x52'
b'%\x90R'
>>> [ hex(x) for x in b'%\x90R' ] # 2 (16 bit) 16
['0x25', '0x90', '0x52']
バイト数のシリアル転送方法:
方法1 python 3.2以上
マクロ:
: ,
>>> int.from_bytes(b'y\xcc\xa6\xbb', byteorder='big')
2043455163
小端法:
: ,
>>> int.from_bytes(b'y\xcc\xa6\xbb', byteorder='little')
3148270713
方法2 structパッケージのインポート
特に注意すべきときunpackの最初のパラメータの決定条件(理解しにくい).
import struct
struct.unpack('>L', b'$\xca\x9a;')[0]
出力結果617257531
メソッド3カスタム関数実装
関数を呼び出せばいい
def bytes_to_int(bytes):
result = 0
for b in bytes:
result = result * 256 + int(b)
return result
def int_to_bytes(value, length):
result = []
for i in range(0, length):
result.append(value >> (i * 8) & 0xff)
result.reverse()
return result
参考資料: