面试题答案
一键面试将32位整数从主机字节序转换为网络字节序(大端序)的函数
#include <stdint.h>
uint32_t htonl_custom(uint32_t hostlong) {
return ((hostlong & 0x000000FF) << 24) |
((hostlong & 0x0000FF00) << 8) |
((hostlong & 0x00FF0000) >> 8) |
((hostlong & 0xFF000000) >> 24);
}
这个实现通过移位操作,将32位整数的每个字节按照大端序重新排列。不管在大端序还是小端序的硬件平台上,都能正确将主机字节序转换为网络字节序(大端序)。因为它是基于对每个字节的直接操作,不依赖于平台默认的字节序存储方式。
C语言中检测当前系统字节序的方法
- 联合(Union)方法
#include <stdio.h>
int check_endianness() {
union {
uint32_t i;
char c[4];
} u;
u.i = 1;
return u.c[0] == 1;
}
这里利用联合的特性,所有成员共享同一块内存。将一个32位整数1
赋值给联合的int
成员,然后检查其char
数组的第一个字节。如果第一个字节是1
,则说明是小端序;否则是大端序。
- 指针方法
#include <stdio.h>
int check_endianness_pointer() {
uint32_t i = 1;
char *c = (char *)&i;
return *c == 1;
}
通过将32位整数的地址强制转换为char
指针,然后检查指向的第一个字节。如果这个字节是1
,则是小端序;否则是大端序。