C++ 网络字节顺序转换;char";

C++ 网络字节顺序转换;char";,c++,network-programming,C++,Network Programming,我一直被教导,如果一个整数大于一个字符,你必须解决字节排序问题。通常,我只需要将其包装在hton[l|s]中,然后用ntoh[l|s]将其转换回。但我不明白为什么这不适用于单字节字符 我不想知道为什么会这样,希望有一位经验丰富的网络程序员能帮我解释一下为什么字节顺序只适用于多字节整数 Ref:您的网络堆栈将正确处理字节中的位,您只需关注如何以正确的顺序获取字节。您不需要从线路上读取单个位,只需读取字节。不管尾数是多少,一个字节前后都是一样的,就像单词“I”前后都一样。在一个字符中,有多少种方式可

我一直被教导,如果一个整数大于一个字符,你必须解决字节排序问题。通常,我只需要将其包装在hton[l|s]中,然后用ntoh[l|s]将其转换回。但我不明白为什么这不适用于单字节字符

我不想知道为什么会这样,希望有一位经验丰富的网络程序员能帮我解释一下为什么字节顺序只适用于多字节整数


Ref:

您的网络堆栈将正确处理字节中的位,您只需关注如何以正确的顺序获取字节。

您不需要从线路上读取单个位,只需读取字节。不管尾数是多少,一个字节前后都是一样的,就像单词“I”前后都一样。

在一个字符中,有多少种方式可以对字节进行排序?

您需要的是

big-endian体系结构存储多字节数据类型的字节,如下所示:

而一个小小的endian体系结构则相反地存储它们:

当数据从一台机器传输到另一台机器时,必须对单个数据类型的字节进行重新排序,以与目标机器的endianness相对应


<>但是当数据类型只包含一个字节时,没有什么可以重新排序。

您需要考虑每个函数所做的事情。因此,您需要将这些知识应用于要修改的类型的大小。考虑以下事项:

#include <stdio.h>
#include <netinet/in.h>

int main () {
    uint16_t i = 42;
    uint8_t c = 42; // a char
    printf ("(uint16_t ) %08X (%d)\n", i, i);
    printf ("(   htons ) %08X (%d)\n", htons(i), htons(i));
    printf ("( uint8_t ) %08X (%c)\n", c, c);
    printf ("(   htons ) %08X (%c)\n", htons(c), htons(c));
    return 0;
}

(uint16_t ) 0000002A (42)
(   htons ) 00002A00 (10752)
( uint8_t ) 0000002A (*)
(   htons ) 00002A00 ()
#包括
#包括
int main(){
uint16_t i=42;
uint8\u t c=42;//一个字符
printf(“(uint16\u t)%08X(%d)\n),i,i);
printf(“(htons)%08X(%d)\n)”,htons(i),htons(i));
printf(“(uint8\u t)%08X(%c)\n”,c,c);
printf(“(htons)%08X(%c)\n”,htons(c),htons(c));
返回0;
}
(uint16_t)0000002A(42)
(htons)00002000(10752)
(uint8_t)0000002A(*)
(htons)00002000()

除了人们所说的所有其他方式之外:Endianness是关于整数中字节的顺序,而不是字节中位的顺序。即使在大端和小端机器上,字节中的位顺序也是相同的。唯一的区别是字节本身用于存储整数(或short或诸如此类)的顺序。因此,由于一个字符中只有一个字节,所以无论是在大端还是小端体系结构中,该值的存储方式都没有区别。

ezpz代码是不正确的

uint16_t i = 65534;
printf ("(uint16_t ) %08X (%d)\n", i, i);

Returns...
(uint16_t ) 0000FFFE (-2)
您应该改用无符号整数,这样它就不会被解释为有符号整数

uint16_t i = 65534;
printf ("(uint16_t ) %08X (%u)\n", i, i);

Returns...
(uint16_t ) 0000FFFE (65534)

许多以太网系统确实对单个比特进行编码——请参阅,尽管速度较快的比特是零比特。+1表示snark。用C和C++定义一个字符是最小的可寻址存储单元。- SNARK的1。你知道OP没有回答的问题的答案。真为你高兴。别胡闹了。放轻松点——OP显然知道字节顺序和hton等——为什么一个字节不需要这个只是其中的一个d'oh时刻。@MartinBeckett:即使我对它做了按位和或加法之类的计算 (签名字符)?这用于将整数中包含的Unicode代码点转换为ᴜᴛꜰ-8.+1,但你可能想重新考虑盗用另一个网站的带宽。@Bill,维基百科关于热链接的政策是-,但wikimedia.org在这里被封锁了,所以我自己无法阅读。请你解释一下好吗?谢谢今天我学到了一些新东西,谢谢!热链接的意思是:“转到它,但是图像可能会改变。注意脚本。”对阻塞感到恼火。@MichaelMyers:
但是当一个数据类型只包含一个字节时,就没有什么需要重新排序的了。
即使我对它进行按位and或加法之类的计算 (签名字符)?这用于将整数中包含的Unicode代码点转换为ᴜᴛꜰ-8.感谢你的回答,有一个“做”的时刻!即使我对它进行按位and或加法运算 (签名字符)?这用于将整数中包含的Unicode代码点转换为ᴜᴛꜰ-8.