Python逆引き:バイナリデータを数値に変換したい

備忘録ヘッダ画像 逆引きソースコード

バイト配列を数値に変換したいときは、int.from_bytes() メソッドを使用できる。

このメソッドを使用すると、指定されたバイトオーダー(エンディアン)に従って、バイト配列を整数に変換することができる。

符号なし4バイト整数bytes→int

# バイト配列を定義
byte_array = b'\x00\x00\x00\x0A'
# ビッグエンディアンでバイト配列を整数に変換
number_int = int.from_bytes(byte_array, byteorder='big')
print(number_int)  # 数値を出力
実行結果
10

このコードでは、b'\x00\x00\x00\x0A' というバイト配列をビッグエンディアンで解釈し、整数に変換している。

int.from_bytes() メソッドの第一引数には変換したいバイト配列を、第二引数の byteorder パラメータにはエンディアン('little' または 'big')を指定する。

符号あり4バイト整数bytes→int

バイト列が2の補数形式であれば、int.from_bytes() メソッドを利用してバイト列から符号付きの整数に変換することができる。

# バイト配列を定義
byte_array = b'\xFF\xFF\xFF\xFF'
# ビッグエンディアンでバイト配列を整数に変換
number_int = int.from_bytes(byte_array, byteorder='big', signed=True)
print(number_int)  # 数値を出力
実行結果
-1

signed=True を指定することで、符号付き整数として解釈してくれる。

2バイトとか8バイト長のときは?

ふだんCとか触っている人なら、shortとかlongサイズの時はどうするのかと思うだろうが、int.from_bytes()は与えられたバイト列の整数表現を返すのみである。
つまりエンディアンと補数表現が正しければ3バイト長でも7バイト長でも突っ込めばとりあえず整数にしてくれるということである。
下のコードもちゃんと-1に変換してくれる。違和感がすごいのは私だけか。

# 3バイト符号付整数として―1を定義
byte_array = b'\xFF\xFF\xFF'
number_int = int.from_bytes(byte_array, byteorder='big', signed=True)
print(number_int)  # ちゃんと-1になる
タイトルとURLをコピーしました