gpt4 book ai didi

python - 考虑字段中的零值的字节字符串反序列化

转载 作者:太空宇宙 更新时间:2023-11-03 20:58:13 25 4
gpt4 key购买 nike

我根据我的原型(prototype)文件(如下所列)收集消息。然后我使用 SerializeToString() 方法将其序列化为字节字符串。然后我使用 ParseFromString() 方法获取字节字符串消息并反序列化为原始对象。但是如果我将某些字段填充为零值并像这样执行上述算法:

def test():
fdm = device_pb2.FromDeviceMessage()
fdm.deveui = bytes.fromhex('1122334455667788')
fdm.fcntup = 0
fdm.battery = 3.5999999046325684
fdm.mode = 0
fdm.event = 1
port = fdm.data.add()
port.port = 1 #device_pb2.PortData.Name(0)
port.value = 0
c = fdm.SerializeToString()
return c

def parse_test(data):
print(data)
res = device_pb2.FromDeviceMessage()
res.ParseFromString(data)
return res

print(parse_test(test()))

,然后 python 控制台将显示:

deveui: "\021\"3DUfw\210"
battery: 3.5999999046325684
event: PERIOD_EVENT
data {
port: VIBR2
}

没有字段的值为零。

但我想看看:

deveui: "\021\"3DUfw\210"
fcntup: 0
battery: 3.5999999046325684
mode: BOUNDARY
event: PERIOD_EVENT
data {
port: VIBR2
value: 0
}

为什么会发生这种情况,如果已修复,我该如何修复它?

============Proto_File================

message FromDeviceMessage{
bytes deveui = 1;
uint32 ts = 2;
int32 fcntup = 3;
float battery = 4;
int32 period = 5;
Mode mode = 6;
Event event = 7;
repeated PortData data = 8;
}

message PortData{
DevicePort port = 1;
int32 value = 2;
}

enum Mode{
BOUNDARY = 0;
PERIOD = 1;
BOUNDARY_PERIOD = 2;
}

enum Event{
BOUNDARY_EVENT = 0;
PERIOD_EVENT = 1;
}

enum DevicePort{
VIBR1 = 0;
VIBR2 = 1;
TEMPL2 = 3;
}

最佳答案

所以,我想我猜到了原因。如果是枚举类型(DevicePort、Event、Mode):默认值是第一个定义的枚举值,它必须为 0。因此我将设置 1 值来查看必填字段。其他情况:不显示零值字段,以减少包的内存大小。但是,如果我使用以下方式转到必填字段: res.data[0].value (在 def parse_test(data) 中),它将显示 0 ,例如,如果我在字段value中设置值0。这条规则适用于所有情况。

关于python - 考虑字段中的零值的字节字符串反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55871436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com