草庐IT

Endianness

全部标签

c++ - 如何编写与字节序无关的 C/C++ 代码?

我进行了一些谷歌搜索,但找不到任何关于这个问题的好文章。在实现我想要与字节序无关的应用时,我应该注意什么? 最佳答案 唯一需要关心字节序的情况是,当您在可能不具有相同字节序的系统之间传输字节序敏感的二进制数据(即非文本)时。正常的解决方案是使用“networkbyteorder”(AKAbig-endian)传输数据,然后根据需要在另一端调整字节。要将主机字节顺序转换为网络字节顺序,请使用htons(3)和htonl(3)。要转换回来,请使用ntohl(3)和ntohs(3)。查看manpage对于你需要知道的一切。对于64位数据,

c++ - C++ 14中二进制文字的字节顺序是什么?

我尝试过四处搜索,但找不到太多关于二进制文字和字节序的信息。二进制字面量是little-endian、big-endian还是其他(例如匹配目标平台)?举个例子,0b0111的十进制值是多少?是7吗?特定平台?还有什么?编辑:我选择了一个错误的值7,因为它在一个字节内表示。尽管有这个事实,这个问题已经得到了充分的回答。一些背景:基本上我试图找出最低有效位的值是什么,并且用二进制文字掩盖它似乎是一个好方法......但前提是有一些关于字节序的保证。 最佳答案 简答:没有。按照你在纸上写的方式写数字。长答案:字节序永远不会直接暴露在代码

c++ - C++ 14中二进制文字的字节顺序是什么?

我尝试过四处搜索,但找不到太多关于二进制文字和字节序的信息。二进制字面量是little-endian、big-endian还是其他(例如匹配目标平台)?举个例子,0b0111的十进制值是多少?是7吗?特定平台?还有什么?编辑:我选择了一个错误的值7,因为它在一个字节内表示。尽管有这个事实,这个问题已经得到了充分的回答。一些背景:基本上我试图找出最低有效位的值是什么,并且用二进制文字掩盖它似乎是一个好方法......但前提是有一些关于字节序的保证。 最佳答案 简答:没有。按照你在纸上写的方式写数字。长答案:字节序永远不会直接暴露在代码

c++ - C++ 中是否有任何 "standard"类似 htonl 的函数用于 64 位整数?

我正在研究memcache协议(protocol)的实现,该协议(protocol)在某些时候使用64位整数值。这些值必须以“网络字节顺序”存储。我希望有一些uint64_thtonll(uint64_tvalue)函数来进行更改,但不幸的是,如果它存在,我找不到它。所以我有1或2个问题:是否有任何便携(Windows、Linux、AIX)标准功能可以做到这一点?如果没有这样的功能,你会如何实现?我想到了一个基本的实现,但我不知道如何在编译时检查字节顺序以使代码可移植。因此,这里非常欢迎您的帮助;)谢谢。这是我写的最终解决方案,感谢Brian的解决方案。uint64_thtonll(u

c++ - C++ 中是否有任何 "standard"类似 htonl 的函数用于 64 位整数?

我正在研究memcache协议(protocol)的实现,该协议(protocol)在某些时候使用64位整数值。这些值必须以“网络字节顺序”存储。我希望有一些uint64_thtonll(uint64_tvalue)函数来进行更改,但不幸的是,如果它存在,我找不到它。所以我有1或2个问题:是否有任何便携(Windows、Linux、AIX)标准功能可以做到这一点?如果没有这样的功能,你会如何实现?我想到了一个基本的实现,但我不知道如何在编译时检查字节顺序以使代码可移植。因此,这里非常欢迎您的帮助;)谢谢。这是我写的最终解决方案,感谢Brian的解决方案。uint64_thtonll(u

c++ - 这个程序是如何工作的?

#includeintmain(){floata=1234.5f;printf("%d\n",a);return0;}它显示一个0!!这怎么可能?原因是什么?我特意在printf语句中放了一个%d来研究printf的行为。 最佳答案 这是因为%d需要一个int但您提供了一个float。使用%e/%f/%g打印float。关于为什么打印0:float在发送到printf之前转换为double。小端double表示的数字1234.5是00000000004A9340%d使用一个32位整数,因此打印一个零。(作为测试,你可以printf(

c++ - 这个程序是如何工作的?

#includeintmain(){floata=1234.5f;printf("%d\n",a);return0;}它显示一个0!!这怎么可能?原因是什么?我特意在printf语句中放了一个%d来研究printf的行为。 最佳答案 这是因为%d需要一个int但您提供了一个float。使用%e/%f/%g打印float。关于为什么打印0:float在发送到printf之前转换为double。小端double表示的数字1234.5是00000000004A9340%d使用一个32位整数,因此打印一个零。(作为测试,你可以printf(

位运算和大小端以及位移操作 bitwise & byte Endianness

大小端的概念大家都很熟悉了。这个概念主要是针对32bit或者64bit机器中,多个字节的排列顺序出处这个词很奇怪,查了下出处。TheComputerSciencetermsBig-EndianandLittle-EndianwereintroducedbyDannyCohen 2 in1980.Thekeyterm endian hasitsrootsinthenovelGulliver’sTravels 3 byJonathanSwift 4 wherewithinawaroccursbetweentwofactionswhoarefightingoverwhichendofaboilede

位运算和大小端以及位移操作 bitwise & byte Endianness

大小端的概念大家都很熟悉了。这个概念主要是针对32bit或者64bit机器中,多个字节的排列顺序出处这个词很奇怪,查了下出处。TheComputerSciencetermsBig-EndianandLittle-EndianwereintroducedbyDannyCohen 2 in1980.Thekeyterm endian hasitsrootsinthenovelGulliver’sTravels 3 byJonathanSwift 4 wherewithinawaroccursbetweentwofactionswhoarefightingoverwhichendofaboilede

关于 c :Union and endianness without htonl/ntohl

Unionandendiannesswithouthtonl/ntohl我想解析我收到的TCP包的标头。假设这是一个标题结构:(2bytesforcommands)+(2bytesfortoken)+(4bytesfordatalength)Exampleofpackage:0x010x020x120x340x000x000x000x05There0x0102iscommand,0x1234istokenand0x000005isdatalength.我想在Windows平台上以有效的方式解析这个头文件。我为此标题创建了下一个联合:typedefunion{  struct  {    uin