首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >考虑到字段中的零值​的字节字符串反序列化

考虑到字段中的零值​的字节字符串反序列化
EN

Stack Overflow用户
提问于 2019-04-26 16:14:07
回答 1查看 121关注 0票数 1

我收集的信息根据我的原型文件(列在下面)。然后使用SerializeToString()方法将其序列化为字节字符串。然后,使用ParseFromString()方法将字节字符串消息和反序列化转化为proto对象。但是,如果我填写一些字段零值并执行上面的算法,如下所示:

代码语言:javascript
复制
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控制台将向我展示:

代码语言:javascript
复制
deveui: "\021\"3DUfw\210"
battery: 3.5999999046325684
event: PERIOD_EVENT
data {
  port: VIBR2
}

没有字段,值为零。

但我想看看:

代码语言:javascript
复制
deveui: "\021\"3DUfw\210"
fcntup: 0
battery: 3.5999999046325684
mode: BOUNDARY
event: PERIOD_EVENT
data {
  port: VIBR2
  value: 0
}

为什么会发生这种事,如果它是固定的,我怎样才能解决它?

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

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-29 20:13:40

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55871436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档