当前位置: 首页 > 知识库问答 >
问题:

如何将协议缓冲区二进制数据(整数)编码/解码为字符串,并将字符串编码为二进制?

陶淳
2023-03-14

我正在使用协议缓冲区和smack制作程序。

smack(xmpp)只能传输字符串类型的数据。并且协议缓冲器可以产生字节阵列数据。所以,我这样做

  1. 使用协议缓冲区制作byte[]数据。
  2. 使用base64将byte[]数据编码为字符串
  3. 使用smack传输
  4. 将接收到的字符串(使用base64编码)解码为字符串
  5. 将解码字符串更改为byte[]
  6. 使用协议缓冲区从byte[]解析数据。

那么没有< code>Integer类型值的每个值都是完美的。< code>Integer的值被更改。这些值位于< code>xxxx.proto中

例如,将字符串 abc = “hello” int 年龄 = 13300 转换为字符串 abc = “hello” int age = 217014255

只更改了int

什么问题?

共有1个答案

钱嘉致
2023-03-14

因为您没有提供代码,所以很难确定,但是我怀疑这些步骤看起来像这样:

String encoded = readMessage();
String decoded = new String(base64Decode(encoded), "ASCII");
byte[] bytes = decoded.getBytes("UTF-8");

这是错误的,因为您实际上在这里做的是将解码的字节解释为ASCII字符串,然后将它们转换回使用UTF-8编码的字节。我相信这将导致您描述的损坏:如果您查看字节模式,您会看到原始消息正好有一个字节设置了顶部位(使其无效ASCII),并且在损坏的消息中,该字节已被Unicode替换字符的UTF-8编码(用于标记错误)替换。您的字符串数据没有损坏,因为它只包含ASCII,而pro buf元数据没有损坏,因为您的字段号都不大于15,因此标签都是1个字节,没有高位集(这使得它们有效的ASCII)。

在任何情况下,字符串类都不能包含原始字节。它只能包含统一码文本。因此,将 base64Decode() 的输出表示为字符串是错误的。它只能是字节 []。也就是说,它应该看起来像:

String encoded = readMessage();
byte[] decoded = base64Decode(encoded);
 类似资料:
  • 问题内容: 我当时用salt实现密码哈希,所以我以二进制形式生成了salt,对密码进行了哈希处理,对base64进行了编码,然后将salt存储到数据库中。 现在,当我检查密码时,应该将盐解码回二进制数据,使用它来哈希提供的密码,对结果进行base64编码,并检查结果是否与数据库中的结果匹配。 问题是,我找不到将盐解码回二进制数据的方法。我使用Buffer.toString方法对它们进行了编码,但似

  • 我正在使用Google Protocol Buffers向服务器发送消息。我对如何发送图像与如何接收图像感到困惑。有关详细信息,请参阅下面的代码,但我的问题是: 我需要base64_decode从未经过base64编码的返回字符串吗,因为它是使用char*和size发送的?也许Google Protocol Buffers处理了这个问题,但我在生成的类中找不到任何证据。 我可能在这里找到了答案,但

  • 我用salt实现密码散列,所以我将salt生成为二进制,对密码进行散列,base64对密码进行编码,然后salt将它们存储到数据库中。 现在,当我检查密码时,我应该将salt解码回二进制数据,使用它对提供的密码进行散列,对结果进行base64编码,并检查结果是否与数据库中的结果匹配。 问题是,我找不到一种方法将salt解码回二进制数据。我使用Buffer.toString方法对它们进行编码,但似乎

  • 我试图找到一种快速/简单的方法,将二元补码字符串转换为负十进制数。我曾尝试使用这个问题中提出的方法,但它不起作用。这是我正在尝试运行的代码: 当我运行此代码时,结果是9。我错过了什么吗?我做错了什么?

  • 问题内容: 我在使用PHP json_encode函数时遇到问题。它将数字编码为字符串,例如 变成 当js遇到这些值时,它将它们解释为字符串,并且对它们的数字运算失败。有谁知道某种防止将数字编码为字符串的方法?谢谢! 问题答案: 我做了一个非常快速的测试: 如果我没记错的话,这似乎就像你所描述的那样? 我得到的输出: 因此,在这种情况下,整数尚未转换为字符串。 不过,这可能取决于我们使用的PHP版

  • 问题内容: 我有一个二进制字符串,如下所示: 我希望我的INT的值是代替 实现此目标的最佳方法是什么? 问题答案: 使用Where 是您的方案无法表示的最小正数。(在这种情况下为8,因为为7且为负。) 大于,所以你减去的,给。