Pythonでバイト配列をつくる

Pythonと別プログラムでプロセス間通信をする必要があったので、通信プロトコルをバイト配列で作るときのやり方をカクニン。
structモジュールを使う。公式は(https://docs.python.org/ja/3/library/struct.html)

# -*- config: utf-8 -*-
""" pack_test.py
"""

import sys
from enum import Enum
from struct import *

class PipeReturnVal(Enum):
    """ Return value define.
    """
    SUCCESS = 0
    PARAM_ERROR = -1
    API_ERROR = -2

def main():
    """ This is entry point
    """
    output = gen_success_buffer()
    print(output) # b'\x00'

    output = gen_param_error()
    print(output) # b'\xff'

    output = gen_api_error()
    print(output) # b'\xfe'

    output = gen_success_and_string()
    print(output) # b'\xfd\x0e\x00thisisaMessage'
    
    
def gen_success_buffer():
    """ Generate 1byte buffer
    """
    return_value = pack('<b', PipeReturnVal.SUCCESS.value)
    return return_value

def gen_param_error():
    """ Generate 1byte buffer
    """
    return_value = pack('<b', PipeReturnVal.PARAM_ERROR.value)
    return return_value

def gen_api_error():
    """ Generate 1byte buffer
    """
    return_value = pack('<b', PipeReturnVal.API_ERROR.value)
    return return_value

def gen_success_and_string():
    """ Generate 1+2+n byte buffer
    """
    status = -3 # running
    msg = 'thisisaMessage' # 14 len
    msg_byte = msg.encode()
    msg_len = len(msg)
 
    # Buffer layout is follows -> | staus | msg len | msg ~~~~~ |
    return_value = pack('<b', status)
    return_value += pack('<h', msg_len)    # short(2byte)    
    return_value += pack('<'+str(msg_len) +'s', msg_byte)

    # val_result = unpack(return_value)
    return return_value

if __name__ == "__main__":
    main()

ポイントは フォーマット文字 (format character)に's'を指定するときで、文字列長分をバイト配列にする場合、繰り返し回数を len(target_str)で指定すること。

フォーマット文字の前に整数をつけ、繰り返し回数 (count) を指定することができます。例えば、フォーマット文字列 '4h' は 'hhhh' と全く同じ意味です。

いいなと思ったら応援しよう!