1
1

More than 3 years have passed since last update.

Python3 でバイト列から整数(short または int) への変換

Last updated at Posted at 2020-09-22

[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)
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