Dan*_*ous 3 c linux network-programming endianness
请考虑以下代码:
#include <stdio.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]) {
uint16_t num = 123;
if (htons(num) == num) {
printf("big endian\n");
} else {
printf("little endian\n");
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道这段代码是否适用于检查字节序?我已经看到很多问题用各种指针/字符技巧检查它,但我认为这更简单.它的假设是,如果将数字转换为网络字节顺序(大端),如果它与原始数字相同,那么你就是一个大端系统.否则你就是一个小端系统.
在这张支票中是否有错误的假设?或许也许网络字节顺序并不总是大端,尽管看起来它是标准化的.
这足以检查运行时的字节顺序.
在大端系统htons(以及ntohs,htonl和ntohl)被定义为无操作,而在小端系统,他们执行字节交换.
编辑:
这也可以使用union来完成.下面的检查检测大端和小端,以及其他更奇特的字节排序.
#include <stdio.h>
#include <stdint.h>
union echeck {
uint32_t i;
char c[4];
} echeck = { .c = { 0x01, 0x02, 0x03, 0x04 } };
int main()
{
if (echeck.i == 0x01020304) {
printf("big endian\n");
} else if (echeck.i == 0x04030201) {
printf("little endian\n");
} else if (echeck.i == 0x02010403) {
printf("pdp endian\n");
} else {
printf("other endian\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)