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' と全く同じ意味です。