Pythonバイト列を整数に変換

2274 ワード


需要:下位機はイーサネットを通じてPython上位機にデータデータを送信し、上位機はbytesタイプのデータとして表示され、以下の通りである.
b'$\xca\x9a;33DDUUffww

このバイト列を数値に変換する必要があります.
この中には16進数のデータが混ざっていて、ASCIIコードもあります.なぜ転送されるバイト列に混在する場合があるのでしょうか.
理由は次のとおりです.
  • 参考資料:http://yinflying.top/2017/07/637

  • バイト列は何ですか.バイナリの符号化されていないバイト(1 Byte)の山で、何も表示されません.1バイトに8 bitがあるので、バイトは数字で表すことができます.バイナリを用いて明らかに長すぎることを表すが、一般的には2桁の16進数で表されるが、バイト列と文字列の本質は対応する関係であるため、pythonにおけるバイト列の操作は文字列とほぼ同じである.
    16進数の上位128(0 x 00~0 x 80)の個数はASCIIと一対一の関係にあるため、pythonではバイト列を表すときに16進数とASCIIコードが混在する場合がある.次のようになります.
    >>> b'\x25\x90\x52'
    b'%\x90R'
    >>> [ hex(x) for x in b'%\x90R' ] #       2   (16 bit)  16    
    ['0x25', '0x90', '0x52']
    

    バイト数のシリアル転送方法:
    方法1 python 3.2以上
    マクロ:
       :        ,         
    >>> int.from_bytes(b'y\xcc\xa6\xbb', byteorder='big')
    2043455163

    小端法:
       :        ,         
    >>> int.from_bytes(b'y\xcc\xa6\xbb', byteorder='little')
    3148270713

    方法2 structパッケージのインポート
  • structのより高度な使い方は、参照してください.https://docs.python.org/3/library/struct.html

  • 特に注意すべきときunpackの最初のパラメータの決定条件(理解しにくい).
    import struct
    struct.unpack('>L', b'$\xca\x9a;')[0]

    出力結果617257531
     メソッド3カスタム関数実装
  • 参考資料:https://coderwall.com/p/x6xtxq/convert-bytes-to-int-or-int-to-bytes-in-python

  • 関数を呼び出せばいい
    def bytes_to_int(bytes):
        result = 0
    
        for b in bytes:
            result = result * 256 + int(b)
    
        return result
    
    def int_to_bytes(value, length):
        result = []
    
        for i in range(0, length):
            result.append(value >> (i * 8) & 0xff)
    
        result.reverse()
    
        return result

    参考資料:
  • 【python 3での符号化と進数変換のまとめ】http://yinflying.top/2017/07/637
  • 【Python札記】byte転integer https://blog.csdn.net/yinxingsha/article/details/52953853 
  • 【Stackoverfolw】https://stackoverflow.com/questions/444591/convert-a-string-of-bytes-into-an-int-python
  • 【カスタム関数実装】https://coderwall.com/p/x6xtxq/convert-bytes-to-int-or-int-to-bytes-in-python