C语言 转换大小端

计算机系统中,数据存储的方式可以是 大端模式(Big Endian) 或 小端模式(Little Endian)。大端模式(Big Endian)是高字节存储在低地址,低字节存储在高地址。小端模式(Little Endian)是低字节存储在低地址,高字节存储在高地址。不同的计算机架构(如 x86、ARM、PowerPC)可能使用不同的字节序,有时需要在不同系统之间转换字节顺序。

1、手动转换大小端

使用 按位运算 (>><<|&) 交换字节的顺序。

1)16 位数(uint16_t)转换

#include <stdio.h>
#include <stdint.h>

uint16_t swap16(uint16_t num) {
    return (num >> 8) | (num << 8);
}

int main() {
    uint16_t num = 0x1234;  // 大端: 0x1234 -> 小端: 0x3412
    uint16_t swapped = swap16(num);

    printf("Original: 0x%X\nSwapped: 0x%X\n", num, swapped);
    return 0;
}

2) 32 位数(uint32_t)转换

#include <stdio.h>
#include <stdint.h>

uint32_t swap32(uint32_t num) {
    return ((num >> 24) & 0x000000FF) |  // 取最高 8 位,移动到最低
           ((num >> 8)  & 0x0000FF00) |  // 取次高 8 位,移动到次低
           ((num << 8)  & 0x00FF0000) |  // 取次低 8 位,移动到次高
           ((num << 24) & 0xFF000000);   // 取最低 8 位,移动到最高
}

int main() {
    uint32_t num = 0x12345678;  // 大端: 0x12345678 -> 小端: 0x78563412
    uint32_t swapped = swap32(num);

    printf("Original: 0x%X\nSwapped: 0x%X\n", num, swapped);
    return 0;
}

3)64 位数(uint64_t)转换

#include <stdio.h>
#include <stdint.h>

uint64_t swap64(uint64_t num) {
    return ((num >> 56) & 0x00000000000000FF) | 
           ((num >> 40) & 0x000000000000FF00) | 
           ((num >> 24) & 0x0000000000FF0000) | 
           ((num >> 8)  & 0x00000000FF000000) | 
           ((num << 8)  & 0x000000FF00000000) | 
           ((num << 24) & 0x0000FF0000000000) | 
           ((num << 40) & 0x00FF000000000000) | 
           ((num << 56) & 0xFF00000000000000);
}

int main() {
    uint64_t num = 0x1234567890ABCDEF;  // 大端: 0x1234567890ABCDEF -> 小端: 0xEFCDAB9078563412
    uint64_t swapped = swap64(num);

    printf("Original: 0x%lX\nSwapped: 0x%lX\n", num, swapped);
    return 0;
}

2、检查当前系统是大端还是小端

可以使用 联合体(union) 或 指针类型转换 来检查。

#include <stdio.h>

int is_big_endian() {
    int num = 1;
    return *(char *)&num == 0;  // 大端返回 1,小端返回 0
}

int main() {
    if (is_big_endian()) {
        printf("系统是大端模式\n");
    } else {
        printf("系统是小端模式\n");
    }
    return 0;
}

3、应用场景

1)网络传输

互联网标准采用 大端格式(Network Byte Order)。计算机通常使用 小端格式(Host Byte Order)。使用 htonl() / ntohl() 进行转换(但这里是手动实现)。

2)二进制文件解

处理不同架构生成的二进制文件,如图片、音频、视频格式等。

3)嵌入式系统

处理 MCU、ARM 设备时,不同厂商可能使用不同字节序。

推荐阅读
cjavapy编程之路首页