【问题标题】:C convert char* to network byte order before transferC 在传输前将 char* 转换为网络字节顺序
【发布时间】:2017-08-26 05:01:05
【问题描述】:

我正在做一个项目,我必须将数据发送到服务器,并且该客户端将在不同的操作系统上运行。我知道不同机器上字节序的问题,所以我将“一切”(几乎)转换为网络字节顺序,在另一端使用 htonl,反之亦然。 另外,我知道对于单个字节,我不需要转换任何东西。但是,我应该为 char* 做什么?例如:

send(sock,(char*)text,sizeof(text));

解决此问题的最佳方法是什么?我应该创建一个“中间函数”来拦截这个“发送”,然后真的逐个发送这个字符数组吗?如果是这样,我是否需要将每个字符转换为网络字节顺序?我认为不,因为每个字符只有一个字节。 考虑到这一点,如果我创建了这个“中间函数”,我就不必再转换为网络字节顺序了,因为这个函数会逐个字符地发送字符,因此不需要字节序的转换。 我对此有任何建议。

【问题讨论】:

  • 您在发送短信吗?然后没有“字节顺序”。文本是单字节的序列,单字节不会有字节顺序问题。除非您有一个每个字符都是多个字节的宽字符串,否则您当然可能会遇到字节顺序问题,并且需要使用预定义的字节顺序。
  • Someprogrammerdude 所说的。文本中的字节序仅适用于每个字符使用多字节值的字符编码,例如 UTF-16 或 UTF-32(因此它们定义了 UTF-16LE/BE 和 UTF-32LE/BE 变体)。大多数文本编码使用 7/8 位值,因此不会出现字节序问题。
  • 我没有注意到,但我在发送之前将所有内容都转换为 char,甚至是整数。像这样:短 p_size = htons(3); end(sock, (char*) &p_size, sizeof (p_size), 0);并且我的字符在使用时不是多字节的。我的问题是:做这个typecastm'send'函数在发送之前将char的每个字符转换为一个字节,或者当我这样调用时它'理解'为一个多字节?因为如果是第二种选择,我必须确保两端的字节序相同。
  • textinitialised 是如何定义的?如果它是一个指针,它是如何定义和初始化的,如果它仍然是一个指针,如何......

标签: c string sockets


【解决方案1】:

根据您的问题,我假设应用层协议(更具体地说是 4 级以上的所有内容)都在您的设计控制之下。对于单字节宽(网络用语中的八位字节宽)数据,字节序排序没有问题,您不需要做任何特别的事情来适应它。现在,如果字符数据前面带有一个长度说明符,例如 2 个八位字节,那么必须一致地处理字节的顺序。

使用网络字节排序(大端)肯定会满足要求,但始终使用小端也是如此。连接两端字节顺序的一致性是关键问题。

如果协议不在您的设计控制之下,那么协议规范应该就多字节整数的字节顺序问题提供指导,您应该遵循这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多