
message mess { optional int32 No = 1; repeated int32 IDs = 2; } 然后我是从 java 层传到 c++层,这个 IDs 字段里,只有没有加入 0 这个数,c++层收到后都是正常的,但只要加入了 0,c++层解析出来的就不对了。
比如: IDs 字段为 [ 64,65,33,22,0 ] ,C++层再解析出来,就只有 [ 64,65,33,22 ] 了.
IDs 字段为 [ 64,65,33,22,0,22 ] ,C++层再解析出来,就变成 [ 64,65,33,22,64 ] 了
总之,只要有 0 在里面,就会很奇怪。
java 层是这么做的,通过 HIDl 接口发给 c++层。
mess proto = new mess(); proto.No = 1; proto.IDs = new int[] {64,65,33,22,0}; String sendString = new String(mess.toByteArray(proto)); c++层是这么解析的:
std::string strProtoBuf = Obj->getProtoInfo(); //反正这里得到了,传来的字符串 mess proto; mess.ParseFromString(strProtoBuf); 求助各位大佬,该怎么解啊
1 lixia625 2020-03-07 17:17:04 +08:00 0 是 int32 的默认值,protobuf 对于默认值就不传了(为了效率) |
2 sikong31 2020-03-07 19:28:17 +08:00 JAVA 和 C++都打个断点,看看编码后的字节一样不一样 不一样在考虑考虑 protobuf 版本的问题 |
3 wanglufei 2020-03-07 20:30:23 +08:00 via Android 看下 protobuf 的数据格式 跟下源码 |
4 Sasasu 2020-03-07 20:42:03 +08:00 最简单的办法是给 repeated packed=true 看看 会改变序列化方式 java 和 c++ 都需要重新编译 |
5 controller 2020-03-07 22:33:08 +08:00 via Android golang protobuf 生成的代码默认加上了 omotempty 的 tag,要么你改下他的源码,要么传字符串 |
6 controller 2020-03-07 22:33:29 +08:00 via Android omit |
7 turi 2020-03-07 22:39:36 +08:00 自己看字节流吧,反正 protobuf int 字段解析很简单,看看到底是哪个地方接错了 |
8 amiwrong123 OP |
9 coer 2020-03-08 01:07:08 +08:00 via Android 有的字节不是在 unicode 上找不到对应字符,然后被替换成 0xfffd,随便什么字节转字符不会出错吗,还是我记错了... |
10 terryching 2020-03-08 08:07:02 +08:00 via Android 你们跨平台传都不序列化的吗 |
11 laminux29 2020-03-08 08:58:50 +08:00 |
12 livepps 2020-03-08 09:26:09 +08:00 via Android 二进制转字符串的都会我也遇到过,跟你的不大一样,是浮点数有问题,后来就不转了 string 了,用二进制 api 收发数据 |
13 sikong31 2020-03-08 10:09:36 +08:00 via iPhone @laminux29 这和 protobuf 的 api 没有关系,是 java string 的 api 的对 byte 数组行为的。错的是不应该转成 string |
14 laminux29 2020-03-08 10:38:28 +08:00 |
15 coer 2020-03-08 17:01:18 +08:00 via Android @laminux29 随便什么 bytes 数组转 string 保存要指定字符集是 iso-8895-1,默认的如果是 unicode 是不行的吧 |
17 coer 2020-03-08 17:23:20 +08:00 via Android 我是说 new string(byte[]).getBytes()出来的字节数组和原字节数组可能是不一样的 |
18 amiwrong123 OP @coer 你说的这个,我试了一下,在 java 的话,两个字节数组是一样的。 但是呢,好像是一旦传到了 C++层后,接受到字符串就不对。而我在 C++层解析后,会丢掉字节数组最后的 0,好像是因为 c++的字符串最后是以'\0'结尾的,所以会丢掉最后的 0。 |
19 coer 2020-03-09 10:41:11 +08:00 @amiwrong123 你用 random 生成 bytes 多试几次吧,如果是默认的 uncoded 字符集,不说内容了,长度都可能不一样 |