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

时间:2015-06-08 10:43:17

标签: python protocol-buffers

收到消息

message MyMessage {
  required bytes mybytesfield = 1;
}

我使用

生成了python代码
protoc -I. --python_out=. message.proto

并尝试添加像这样的字节字段(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())

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

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

1 个答案:

答案 0 :(得分:3)

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

Python 2.7中的

bytesstr的别名,在Python 3.x中bytes执行"期望"事物和bytes([0xde, 0xad])产生b'\xde\xad

设置mybytesfield的正确方法如下:

msg.mybytesfield = b'\xDE\xAD' #literal

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

msg.mybytesfield = ''.join(chr(item) for item in [0xDE, 0xAD])