[11, 24, 250, 1] のような1バイト以内の値のリストから、16bit または 32bit 整数へ変換する方法です。
とあるデバイスから1バイトずつ値を読み取って、それを 16bit 符号付き整数 (short) のリストへ変換する方法を調べたとき、なかなか見つからなかったので記事にしました。
##長さがわかっているとき
入力データのサイズがあらかじめ分かっている場合は、struct.unpack を使えば簡単です。
import struct
input_data = [11, 24, 250, 1]
# 16bit 符号付き整数に変換する場合(リトルエンディアン)
short_values = struct.unpack('<hh', bytes(input_data))
print("short_values:", short_values)
# 32bit 符号なし整数に変換する場合(ビッグエンディアン)
ulong_value = struct.unpack('>L', bytes(input_data))
print("ulong_value:", ulong_value)
# 32bit 符号付きに変換する場合は int.from_bytes も使える
long_value = int.from_bytes(bytes(input_data), 'big')
print("long_value:", long_value)
ほかの型に変換したい場合は、struct の書式指定文字 を見てください。
どんな長さにも対応したいとき
入力データのサイズが可変なとき、または汎用的にしたい場合は array を使うと便利です。
import array
input_data = [11, 24, 250, 1]
# 16bit 符号付き整数に変換する場合(リトルエンディアン)
short_values = array.array('h', bytes(input_data))
print("short_values:", short_values)
# 32bit 符号なし整数に変換する場合(リトルエンディアン)
ulong_values = array.array('L', bytes(input_data))
print("ulong_values:", ulong_values)