无符号整数转换为点分十进制IP地址

6 篇文章 0 订阅

背景

在gdb调试ip地址过程中,往往看到的是一个整数,而不知其具体对应的点分十进制IP地址为多少。

方案一

使用字节对齐方式获得具体点分十进制IP为多少

数据结构

typedef union int2Ip {
    unsigned int addr;
    struct {
        unsigned char a1;
        unsigned char a2;
        unsigned char a3;
        unsigned char a4;
    };
} int2Ip_t;

方案二

区分大端小端来确定具体点分十进制IP地址为多少

unsigned int intIp = 1613535268;
#if __BYTE_ORDER == __BIG_ENDIAN
    printf("%d.%d.%d.%d\n", (intIp >> 24) & 0xff, (intIp >> 16) & 0xff, (intIp >> 8) & 0xff, intIp & 0xff);
#else
    printf("%d.%d.%d.%d\n", intIp & 0xff, (intIp >> 8) & 0xff, (intIp >> 16) & 0xff, (intIp >> 24) & 0xff);
#endif

案例分析

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

typedef union int2Ip {
    unsigned int addr;
    struct {
        unsigned char a1;
        unsigned char a2;
        unsigned char a3;
        unsigned char a4;
    };
} int2Ip_t;

int main(int argc, const char *argv[])
{
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    struct sockaddr_in addr1 = {0};
    addr1.sin_family = AF_INET;
    addr1.sin_port = htons(6000);
    addr1.sin_addr.s_addr = inet_addr("192.168.129.187");

    int2Ip_t int2ip = {
        .addr = 3145836736
    };

    struct sockaddr_in addr2 = {0};
    addr2.sin_family = AF_INET;
    addr2.sin_port = htons(6000);
    addr2.sin_addr.s_addr = inet_addr("127.0.0.1");
    int2Ip_t int2ip2 = {
        .addr = 16777343
    };

    struct sockaddr_in addr3 = {0};
    addr3.sin_family = AF_INET;
    addr3.sin_port = htons(6000);
    addr3.sin_addr.s_addr = inet_addr("36.152.44.96");
    int2Ip_t int2ip3 = {
        .addr = 1613535268
    };

    unsigned int intIp = 1613535268;
#if __BYTE_ORDER == __BIG_ENDIAN
    printf("%d.%d.%d.%d\n", (intIp >> 24) & 0xff, (intIp >> 16) & 0xff, (intIp >> 8) & 0xff, intIp & 0xff);
#else
    printf("%d.%d.%d.%d\n", intIp & 0xff, (intIp >> 8) & 0xff, (intIp >> 16) & 0xff, (intIp >> 24) & 0xff);
#endif

    sleep(10);

    return 0;
}

gdb调试验证其正确性

(gdb) run 
Starting program: /Asterisk/LocalDir/testDir/a.out 
整数转换为点分十进制IP地址为:36.152.44.96
^C
Program received signal SIGINT, Interrupt.
0x00007ffff7ad9370 in nanosleep () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) frame 2
#2  0x00000000004007d8 in main (argc=1, argv=0x7fffffffe238) at test6.c:54
54        sleep(10);
(gdb) info locals 
sockfd = 3
addr1 = {sin_family = 2, sin_port = 28695, sin_addr = {s_addr = 3145836736}, sin_zero = "\000\000\000\000\000\000\000"}
int2ip = {addr = 3145836736, {a1 = 192 '\300', a2 = 168 '\250', a3 = 129 '\201', a4 = 187 '\273'}}
addr2 = {sin_family = 2, sin_port = 28695, sin_addr = {s_addr = 16777343}, sin_zero = "\000\000\000\000\000\000\000"}
int2ip2 = {addr = 16777343, {a1 = 127 '\177', a2 = 0 '\000', a3 = 0 '\000', a4 = 1 '\001'}}
addr3 = {sin_family = 2, sin_port = 28695, sin_addr = {s_addr = 1613535268}, sin_zero = "\000\000\000\000\000\000\000"}
int2ip3 = {addr = 1613535268, {a1 = 36 '$', a2 = 152 '\230', a3 = 44 ',', a4 = 96 '`'}}
intIp = 1613535268
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值