【问题标题】:How can I merge multiple char arrays including the null chars they might contain?如何合并多个字符数组,包括它们可能包含的空字符?
【发布时间】:2014-09-25 02:41:47
【问题描述】:

我正在尝试实现一个具有以下结构的应用网络协议:

|First 2 bytes is the command|next 4 bytes is the payload length|and then the payload|

命令是一个字符[2],有效载荷长度是一个字符[4]。

我正在使用以下函数将有效负载长度 (int) 转换为 4 字节数组。如果有效载荷长度小于 256 字节,则保存该值的数组的前 3 个字节为空,只有最后一个包含该值。

void intToBytes(int value, char *buffer)
{
    buffer[0] = (value >> 24) & 0xff;
    buffer[1] = (value >> 16) & 0xff;
    buffer[2] = (value >> 8)  & 0xff;
    buffer[3] = value & 0xff;
 }

如何将命令 char[2]、有效载荷长度 char[4] 和有效载荷 char[any] 合并到一个新的 char 数组中?

我试过了:

strcpy(msg,command);
strcat(msg,payloadlength);
strcat(msg,payload);

但 msg char 数组仅包含命令和有效负载,并忽略有效负载长度字节。我在这里做错了什么?

【问题讨论】:

  • C 还是 C++?答案会大不相同。
  • @hyde: 项目是 C++
  • 好的,删除了 C 标签。另请注意,除非您使用using namespace std,否则您应该将std::strcpy 用于来自#include <cstring> 的函数。离开std:: 大部分都可以工作,但C++ 标准不保证。

标签: c++ sockets char


【解决方案1】:

不要使用 C 风格的字符串函数,它们用于 C 风格的字符串。这是任意二进制数据,您应该使用适用于任意二进制数据的函数。也许std::vector <unsigned char>

【讨论】:

    【解决方案2】:

    您不能使用字符串函数来操作二进制数据。 如果你使用 c,那么你应该使用memcpy() 函数。 如果你使用c++,那么最好的就是std::vector。

    【讨论】:

    • 在 C++ 中,也可以将std::string 用于字节数组,因为它不关心 NUL 字符本身,但我认为std::vector 更常见。
    猜你喜欢
    • 2012-12-03
    • 2017-04-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    相关资源
    最近更新 更多