はじめに
Pythonの数値処理関係で下記の操作をよくすることがあるのでまとめてみた。
- 数値文字列⇔数値変換
- 2,10,16進数変換
- 数値⇔バイナリ変換
- 数値テキスト(ASCII)ファイル⇔バイナリファイル変換
- HEX文字列エンディアン変換
数値→文字列
format()
を使用する。進数と桁数を指定して数値文字列へ変換。例の変換前の数値0x1234ABCDは16進数に統一しているが、16進数でなくても変換できる。
#数値→16進数8桁
num_string = '0x{:08X}'.format(0x1234ABCD)
print(type(num_string),num_string)
#数値→10進数10桁
num_string = '{:010d}'.format(0x1234ABCD)
print(type(num_string),num_string)
#数値→2進数32桁
num_string = '{:032b}b'.format(0x1234ABCD)
print(type(num_string),num_string)
出力結果
<class 'str'> 0x1234ABCD
<class 'str'> 0305441741
<class 'str'> 00010010001101001010101111001101b
文字列→数値
int()
を使用する。文字列の進数を指定して変換する。
#16進数文字列→数値
num = int('0x1234ABCD',16)
print(type(num),num)
#10進数文字列→数値
num = int('305441741',10)
print(type(num),num)
#2進数文字列→数値
num = int('00010010001101001010101111001101',2)
print(type(num),num)
出力結果
<class 'int'> 305441741
<class 'int'> 305441741
<class 'int'> 305441741
数値→バイナリ
to_bytes
を使用する。数値をbytearray型に変換する。桁数と、エンディアンを指定する。用途としては、数値をバイナリデータとしてファイルに保存したり、外部機器とシリアル通信のデータ送信をするときに扱う。
#数値→バイナリ4byteビックエンディアン
num = 0xABCDEF01
binary=num.to_bytes(4,'big')
print(type(binary),binary)
#数値→バイナリ4byteリトルエンディアン
num = 0xABCDEF01
binary=num.to_bytes(4,'little')
print(type(binary),binary)
出力結果
<class 'bytes'> b'\xab\xcd\xef\x01'
<class 'bytes'> b'\x01\xef\xcd\xab'
バイナリ→数値文字列
from_bytes()
とformat()
を使用する。from_bytes()でバイナリ→数値変換された後、format()で数値を数値文字列に変換する。数値のままで処理する場合は、format()は不要。用途としては、バイナリファイルのデータを処理したり、外部機器とシリアル通信の受信データを処理するときに扱う。
#バイナリ4byteビックエンディアン→数値文字列
binary = b'\xab\xcd\xef\x01'
num_string='0x{:08X}'.format(num.from_bytes(binary,'big'))
print(type(num),num)
print(type(num_string),num_string)
#バイナリ4byteリトルエンディアン→数値文字列
binary = b'\x01\xef\xcd\xab'
num_string='0x{:08X}'.format(num.from_bytes(binary,'little'))
print(type(num),num)
print(type(num_string),num_string)
出力結果
<class 'int'> 2882400001 # 16進数の0xABCDEF01
<class 'str'> 0xABCDEF01
<class 'int'> 2882400001 # 16進数の0xABCDEF01
<class 'str'> 0xABCDEF01
HEX文字列→バイナリ
bytes.fromhex()
を使用する。用途は、数値テキストファイルのデータ列をバイナリファイルへ変換するときなど。
#HEX文字列→バイナリ変換
hex_string='ABCDEF01ABCDEF01ABCDEF01'
binary=bytes.fromhex(hex_string)
print(type(binary),binary)
出力結果
<class 'bytes'> b'\xab\xcd\xef\x01\xab\xcd\xef\x01\xab\xcd\xef\x01'
バイナリ→HEX文字列
hex()
を使用する。用途は、バイナリファイルの数値データ列を数値テキストファイルへ変換するときなど。
#バイナリ→HEX文字列変換
binary=b'\xab\xcd\xef\x01\xab\xcd\xef\x01\xab\xcd\xef\x01'
hex_string=binary.hex()
print(type(hex_string),hex_string)
出力結果
<class 'str'> abcdef01abcdef01abcdef01
HEX文字列のエンディアン変換
HEX文字列をBig/Little変換する。re.sub()
で正規表現変換。
import re
# HEX文字列 16bit
hex_string='1234'
hex_string=re.sub(r'(..)(..)',r'\2\1',hex_string)
print(type(hex_string),hex_string)
# HEX文字列 32bit
hex_string='ABCD1234'
hex_string=re.sub(r'(..)(..)(..)(..)',r'\4\3\2\1',hex_string)
print(type(hex_string),hex_string)
出力結果
<class 'str'> 3412
<class 'str'> 3412CDAB
エンディアンについてもう少し。
以上