如何使用 python protobuf 2.5.0 设置字节字段?

ece*_*ulm 5 python protocol-buffers

有留言

message MyMessage {
  required bytes mybytesfield = 1;
}
Run Code Online (Sandbox Code Playgroud)

我生成了 python 代码

protoc -I. --python_out=. message.proto
Run Code Online (Sandbox Code Playgroud)

并尝试添加这样的字节字段(Python 2.7.6):

import message_pb2 as mpb

msg = mpb.MyMessage()
msg.mybytesfield = bytes([0xDE, 0xAD])
# msg.mybytesfield = b'\xDE\xAD'
with open("output.bin", "w") as f:
    f.write(msg.SerializeToString())
Run Code Online (Sandbox Code Playgroud)

但它似乎对文字进行编码,[222, 173]而不是dead根据 的输出进行判断hexdump -C

正确的写入方法是0xDEAD什么mybytesfield

ece*_*ulm 3

bytes([0xDE, 0xAD])b'\xde\xad'在 Python 2.7 中不翻译为'[222, 123]'10 个字符的字符串,它是数组的字符串表示形式。

bytes在Python 2.7中是 的别名str,在Python 3.x中bytes执行“预期”的事情并bytes([0xde, 0xad])产生b'\xde\xad

正确的设置方法mybytesfield如下:

msg.mybytesfield = b'\xDE\xAD' #literal
Run Code Online (Sandbox Code Playgroud)

或者如果您首先需要一个整数列表/数组:

msg.mybytesfield = ''.join(chr(item) for item in [0xDE, 0xAD]) 
Run Code Online (Sandbox Code Playgroud)