【问题标题】:storing 0 in a unsigned char array将 0 存储在无符号字符数组中
【发布时间】:2020-09-23 10:11:50
【问题描述】:

我有一个像这样的unsigned char 数组:

unsigned char myArr[] = {100, 128, 0, 32, 2, 9};

我正在使用reinterpret_cast 将其转换为const char*,因为我必须将const char* 传递给一个方法。然后通过 grpc 和其他应用程序发送此信息(基于 erlang 的应用程序接收它并将其存储在 erlang Bin 中)。但我观察到的是 Erlang 应用程序只收到了 > ,之后什么也没有。这可能是什么原因造成的?这里的问题是字符数组中的0 吗?有人可以解释如何处理 unsigned char 数组中的 0 吗?我确实阅读了很多答案,但都没有清楚地解释我的问题。

【问题讨论】:

  • 如何进行转换?
  • “可能是什么原因造成的” - 有人使用 strlen 进行缓冲区发送长度计算。

标签: c++ unsigned-char


【解决方案1】:

这可能是什么原因造成的?这里的问题是字符数组中的 0 吗?

很可能,是的。

可能将指针传递给的函数之一被指定为接受指向空终止字符串的参数。您的数组碰巧是通过在索引 2 处包含空字符来终止的,这是字符串终止的地方。这样的函数通常只有在数组以 null 结尾的情况下才会有明确定义的行为,因此将指针传递给可能不包含 null 字符的任意二进制文件将非常危险。

有人能解释一下如何处理 unsigned char 数组中的 0 吗?

不要将数组传递给需要以空字符结尾的字符串的函数。这包括大多数格式化输出函数和<cstring> 中的大多数函数。函数的文档应该提到前置条件。

如果此类函数是您唯一的选择,那么您可以将二进制数据编码为文本格式,然后在另一端对其进行解码。二进制数据常用的文本编码是 Base64,尽管它不一定是最佳的。

【讨论】:

  • 这个函数是一个.proto文件编译后自动生成的。
  • @Purdgr8 什么是“这个函数”?
  • 我必须将数组传递给的函数。所以,我不确定我还有什么选择。至于您建议的编码,这意味着在其他应用程序中添加一些解码机制。不幸的是,我不允许更改代码的另一面。
猜你喜欢
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
相关资源
最近更新 更多