MST
星途 面试题库

面试题:C语言可移植性编程中的字节序处理

在可移植的C语言程序中,如何处理不同硬件平台的字节序问题?请编写一个函数,能够将一个32位整数从主机字节序转换为网络字节序(大端序),并说明你的实现如何确保在不同平台上都能正确工作。另外,列举至少两种在C语言中检测当前系统字节序的方法。
47.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

将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语言中检测当前系统字节序的方法

  1. 联合(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,则说明是小端序;否则是大端序。

  1. 指针方法
#include <stdio.h>

int check_endianness_pointer() {
    uint32_t i = 1;
    char *c = (char *)&i;
    return *c == 1;
}

通过将32位整数的地址强制转换为char指针,然后检查指向的第一个字节。如果这个字节是1,则是小端序;否则是大端序。