starwing / lua-protobuf

A Lua module to work with Google protobuf
MIT License
1.71k stars 388 forks source link

pb.encode double/float 类型数据,在C++里ParseFromString会有问题。 #258

Open hz-bin opened 6 months ago

hz-bin commented 6 months ago

lua代码:

protoc:load([[
    syntax = "proto3";
    message TestNumber {
        double a = 1;
        float b = 2;
        int32 c = 3;
    }
]])
local tt = {
    a = 100,
    b = 200,
    c = 300
}
local s = pb.encode("TestNumber", tt)
PBTestNumber(s)

C++代码:

int PBTestNumber(lua_State* L) {
    string s = lua_tostring(L, 1);
    TestNumber* msg = new TestNumber();
    msg->ParseFromString(s);
    std::cout << "in PBTestNumber msg=" << msg->ShortDebugString() << std::endl;
    return 0;
}

这里输出的是:in PBTestNumber msg=c: 300

starwing commented 6 months ago

我感觉ParseFromString有问题,得到的是二进制数据,你没取长度会在0的地方截断

hz-bin commented 6 months ago

我感觉ParseFromString有问题,得到的是二进制数据,你没取长度会在0的地方截断

用ParseFromArray,改成下面这样就ok了。多谢大佬。

int PBTestNumber(lua_State* L) {
    size_t len;
    const char* s = lua_tolstring(L, 1, &len);
    TestNumber * msg = new TestNumber();
    msg->ParseFromArray(s, len);
    std::cout << "in PBTestNumber msg=" << msg->ShortDebugString() << std::endl;
    return 0;
}