1

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

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

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

4

1 回答 1

4

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

很可能,是的。

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

有人可以解释如何处理无符号字符数组中的 0 吗?

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

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

于 2020-09-23T10:30:48.463 回答