starwing / lua-protobuf

A Lua module to work with Google protobuf
MIT License
1.75k stars 387 forks source link

repeated int32解析出错 #39

Closed yiyucyp closed 6 years ago

yiyucyp commented 6 years ago

遇到一个比较奇怪的BUG,解析的数据与nodejs的不一致,但是nodejs的两种数据都能decode,pb不行 protoc:load([[ message login_test_res{ repeated int32 r = 1; } ]])

print(pb.tohex(pb.encode("login_test_res", {r = {1,2000}}))) --打印数据为08 01 08 D0 0F local backp1 = pb.decode("login_test_res", "\8\1\8\208\15") --所以上面的数据能正常decode --下面的数据为JS中解出来数据 local backp = pb.decode("login_test_res", "\10\3\1\208\15")

--JS中的测试如下 proto.load("login.proto", function(err, root){ if (err) throw err;

    const Login = root.lookupType("login_test_res");  
    let message = Login.create(
        {
            "r":[1, 2000]
        }
    )   

    let buf = Login.encode(message).finish();
    console.log(`login:$s`, buf.toString("hex"));
    //buf的数据为login:$s 0a0301d00f,也就是10,3,1,208,15

    var arr = new Array(8,1,8,208,15);
    var msg = Login.decode(arr)//lua encode后的数据正常解析出
    var msg1 = Login.decode(new Array(10,3,1,208,15))// JS自身的数据正常解析出
    //但是最终这个数据在lua中不能正常decode出来

})

发现是[packed=true]这个相关,加上后pb的结果就是10,3,1,208,15

starwing commented 6 years ago

你要看你js是不是默认proto3,proto3是默认packed的,看#16