大端存储小端存储

本文介绍了IP地址在不同字节序间转换的方法,包括点分十进制到网络字节序的转换、网络字节序到点分十进制的转换及大端小端之间的相互转换,并提供了判断本机存储模式的两种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大端小端转换问题
终端中获得的点分十进制形式的ip地址,ip地址在网络中以大端格式传输,本地存储的是以小端格式。
`ping www.baidu.com`获得的ip为`58.217.200.15`

该地址的十六进制(本地小端存储)为`3ad9c80f`,在网络中传输地址为`0fc8d93a`.

    1.将点分十进制地址转换为网络地址
    int ip_aton(char* ip_addr) {
        int buf[4];
        memset(buf, 0, 16);
        sscanf(ip_addr, "%d.%d.%d.%d", &buf[0], &buf[1], &buf[2], &buf[3]);
        int index = 0, result = 0;
        for (index = 0; index < 4; ++index) {
            result |= (buf[index] &0xff);
            if (index < 3) {
                result = result << 8;
            }
        }
        return result;
    }
    2.将网络地址转换为点分十进制地址(字符串ip_addr接收此地值)
    void ip_ntoa(int ip, char *ip_addr) {
        int len = strlen(ip_addr);
        int index;
        memset(ip_addr, 0, len);
        int a[4];
        for (index = 0; index < 4; ++index) {
            a[index] = (int)(ip & 0xff);
            ip = ip >> 8;
        }
        sprintf(ip_addr, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
    }
    3.大端存储小端存储之间的相互转换
    int reverse(int src)
    {
        int b ;
        b = ((src & 0xff) << 24)|((src & 0xff000000)>>24)| \
        (( src & 0xff00) <<8)|((src & 0xff0000)>>8);
        return b ;
    }
    4.判断本机编译器是大端模式还是小端模式
    //方法1
    void test() {
        short int x;
        char x0, x1;
        x = 0x1122;
        x0 = ((char*)&x)[0];//将数组指针强制转换为字符指针取第0个元素
        x1 = ((char*)&x)[1];
        if (0x11 == x0) {
            printf("大端存储\n");
        } else {
            printf("小端存储\n");
        }
    }
    //方法2:取一个ip地址,使用int inet_aton(const char *cp, struct in_addr *inp),根据打印结果和ip地址比较
    oid test2() {
        char ip[] = "58.217.200.15";
        struct in_addr myaddr;
        inet_aton(ip, &myaddr);
        printf("%08x\n", myaddr.s_addr);
    }
    打印结果为:`0fc8d93a`,你可以考虑ip`58.217.200.15`正常的网络字节序应该为‘3ad9c80f’。所以打印结果和网络字节序位置颠倒,所以为小端存储。



<think>好的,用户想了解大端模式和小端模式的存储区别以及应用场景。首先,我需要明确这两个概念的定义。大端模式是将数据的高位字节存储在内存的低地址,而小端模式则是将低位字节放在低地址。这点需要详细解释,最好用例子说明,比如数字0x12345678在不同模式下的存储方式。 然后,用户可能想知道它们的区别,比如字节顺序的不同、数据解析的方式以及在不同系统中的应用。这里可能需要提到常见的系统,比如网络协议通常使用大端,而x86架构使用小端。同时,应用场景方面,比如网络传输、跨平台数据交换等使用大端,而本地存储和处理器设计可能用小端。 接下来,用户可能需要示例来更直观地理解。可以用一个具体的数值在内存中的布局来展示两种模式的差异。此外,引用中的资料提到了大端模式的简介,可以结合这个引用进一步说明。 还需要考虑用户可能的后续问题,比如如何检测系统是哪种模式,或者处理字节序问题的方法。因此,在相关问题部分可以包含这些内容。 最后,确保回答符合系统级指令:行内数学表达式用$...$,独立公式用$$...$$,语法正确,中文回答,生成相关问题,并在引用处添加标识。检查是否有遗漏的要点,确保结构清晰,帮助用户逐步理解。</think>### 大端模式 vs 小端模式的存储方式区别 #### 1. **核心定义** - **大端模式(Big-Endian)**:多字节数据的高位字节存储在内存的低地址处,低位字节存储在高地址处。例如,数值 $0x12345678$ 在内存中的存储顺序为: ``` 低地址 → 0x12 | 0x34 | 0x56 | 0x78 ← 高地址 ``` - **小端模式(Little-Endian)**:多字节数据的低位字节存储在内存的低地址处,高位字节存储在高地址处。例如,同一数值的存储顺序为: ``` 低地址 → 0x78 | 0x56 | 0x34 | 0x12 ← 高地址 ``` #### 2. **主要区别** | **特性** | 大端模式 | 小端模式 | |-----------------|---------------------------|---------------------------| | **字节顺序** | 高位在前,低位在后 | 低位在前,高位在后 | | **数据解析** | 直接符合人类阅读习惯 | 需要逆序转换 | | **常见应用** | 网络协议(如TCP/IP)[^1] | x86/x64架构处理器、本地存储 | #### 3. **应用场景** - **大端模式**: - 网络数据传输(如IP地址口号的封装)[^1] - 跨平台文件格式(如PNG图像、Java Class文件) - **小端模式**: - x86/x64处理器架构的内存存储 - 本地数据存储(如Windows系统文件) #### 4. **检测示例(C语言)** ```c #include <stdio.h> int main() { int num = 0x12345678; char *p = (char*)# if (*p == 0x78) printf("Little-Endian\n"); else printf("Big-Endian\n"); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值