1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonで数値・数値文字列・バイナリ変換

Last updated at Posted at 2023-09-17

はじめに

 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

エンディアンについてもう少し。

以上

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?