使用python将字节字符串转换为protobuf

2024-06-16 13:29:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从事一个mqtt项目,在该项目中,我订阅了一个以字节字符串形式向我返回数据的代理。我必须将数据转换成protobuf,然后在dict中。下面是我收到的数据的一个示例

b'\n\x108cf9572000023509\x10\x03\x1a\x06uplink \xd4\xc9\xc6\xea\x9a/*\x10b827ebfffebce2d30\xbe\xff\xff\xff\xff\xff\xff\xff\xff\x01=\x00\x00\x18AE4\x13YDH\x05P\x01Z\x01C`\x8c\x06h\x08z \x02\x05e!\x08\x01\x00f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x0f\x00\x82\x01"\n\x10b827ebfffebce2d3\x10\xbe\xff\xff\xff\xff\xff\xff\xff\xff\x01\x1d\x00\x00\x18A'

my.proto文件的结构

    message RXInfoSimplified {
        string ID = 1;
        int32 RSSI = 2;
        float SNR = 3;
    }
    
message DeviceUplink {
    string DevEUI = 1;
    int64 ApplicationID = 2;
    string MsgType = 3;
    int64 Timestamp = 4;
    string GatewayID = 5;
    int32 RSSI = 6;
    float SNR = 7;
    float Frequency = 8;
    int32 DataRate = 9;
    bool ADR = 10;
    string Class = 11;
    uint32 FCnt = 12;
    int32 FPort = 13;
    bool Confirm = 14;
    bytes Data = 15;
    repeated RXInfoSimplified Gateways = 16;
}

我在回拨中尝试了以下方法:

m = sub_message.DeviceUplink()
def on_message(client, userdata, msg):  
    m.ParseFromString(msg.payload)
    print(m)

我得到:

DevEUI: "8cf9572000023509"
ApplicationID: 3
MsgType: "uplink"
Timestamp: 1622117284775
GatewayID: "b827ebfffebce2d3"
RSSI: -61
SNR: 10.25
Frequency: 868.1
DataRate: 5
ADR: true
Class: "C"
FCnt: 796
FPort: 8
Data: "\002\005\220!\023\004\000p\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\335\016\000"
Gateways {
  ID: "b827ebfffebce2d3"
  RSSI: -61
  SNR: 10.25
}

如何转换字符串中的数据值


Tags: 数据项目字符串messagestringfloatrssix10
1条回答
网友
1楼 · 发布于 2024-06-16 13:29:04

因为Data在原型定义中有一个bytes类型,所以在python3+中有一个^{}类型。在.proto文件中没有关于如何解释该字段的任何进一步信息,就协议缓冲区库而言,它是一个原始字节字符串,仅此而已

由您决定如何处理字段值。在Data字段中应该是什么?可能是您知道的某种类型的序列化消息?在这种情况下,只需再次使用ParseFromString

相关问题 更多 >