背景
pythonでuartやi2c通信するプログラムを書く際に数値情報とbytesの変換に毎度戸惑うので、備忘録として記述例と関連情報を記事に残します。下記の記事を参考にしました。
pythonの数値・bytes相互変換(+おまけ:bytesを誤ってstr変換して保存してしまった場合)
int型はto_bytesとfrom_bytes
int型ならto_bytesで変換し、from_bytesで戻せます。valInt = 64
valBytes = valInt.to_bytes()
print(valBytes)
print(int.from_bytes(valBytes))
b'@'
64
byte数を指定したいなら第一引数に数を渡せば良いです。
valInt = 64
valBytes = valInt.to_bytes(4)
print(valBytes)
print(int.from_bytes(valBytes))
b'\x00\x00\x00@'
64
指定していなければビックエンディアンですが、指定すればリトルエンディアンにもできます。
valInt = 64
valBytes = valInt.to_bytes(4, "little")
print(valBytes)
print(int.from_bytes(valBytes, "little"))
b'@\x00\x00\x00'
64
float型はstructのpack unpackのfオプション
c言語の型とpythonの型の橋渡しをするstruct型がpythonに定義されているので、それを使うとfloatとbytesの変換が可能です。ビッグエンディアンとリトルエンディアンは型指定の先頭で行います。
> ビッグエンディアン
< リトルエンディアン
unpackの結果はtuple型で返されるので、第一要素を使います。
ビッグエンディアン版
import struct
valFloat = 2.5
valBytes = struct.pack(">f", valFloat)
print(valBytes)
print(struct.unpack(">f", valBytes)[0])
b'@ \x00\x00'
2.5
リトルエンディアン版
import struct
valFloat = 2.5
valBytes = struct.pack("<f", valFloat)
print(valBytes)
print(struct.unpack("<f", valBytes)[0])
b'\x00\x00 @'
2.5
期待通りに32bitのbytesになり、復元もできました。
おわり
pythonでのintとfloatのbytesとの変換方法の備忘録をまとめました。今度からgoogle検索ではなく自分の記事の検索で変換方法を把握できます。

0 件のコメント :
コメントを投稿