0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

バイト列の型変換

Last updated at Posted at 2021-12-04

はじめに

PLCとpythonを通信してデータを取ろうとした時、想定していた値と違う数値が返ってきて困ったことがありました。
struct標準ライブラリを使用して解決できたので記載します。

内容

例) 0.25が正しい値だが、1048576000となる
原因)浮動小数点数のバイト列を整数型で変換していた

解決策↓


from struct import pack, unpack

def convert_2word_to_double(value: int) -> float:
    """PLCから取得した数値を変換する
    32bit符号無し整数から符号あり浮動小数点数へ変更

    Parameters
    ----------
    value: int
        PLCから取得した値

    Returns
    -------
    result: float
        valueを変換した値

    """
    
    binary = pack('>L', value)
    return unpack('>f', binary)[0]

# 0.25になればok -> 0.25
print(convert_value(1048576000))

その他の型にも変換できそうです。

参考

struct --- バイト列をパックされたバイナリデータとして解釈する — Python 3.10.0b2 ドキュメント
浮動小数点数のバイナリ表現を10進数表記へ変換してみる - esm アジャイル事業部 開発者ブログ
浮動小数点数内部表現シミュレーター - instant tools

0
0
2

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?