news 2026/5/1 10:50:32

字节序及IP地址转换

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
字节序及IP地址转换

文章目录

  • 字节序
    • 检测主机字节序
    • 字节序转换函数
      • 函数原型
      • 示例
    • IP地址字符串与二进制转换
      • 传统转换函数(IPv4专用)
      • 现代转换函数(支持IPv4/IPv6)
      • 线程安全的转换

字节序

  • 定义:多字节数据在内存中存储或网络传输时各字节的顺序
  • 两种类型:
    • 大端字节序(Big-endian):高位字节在前(网络标准)
    • 小端字节序(Little-endian):低位字节在前(x86/ARM常见)
数值: 0x11223344 (十进制: 287,454,020) 内存地址: 低地址 → → → 高地址 大端存储: [0x11] [0x22] [0x33] [0x44] 小端存储: [0x44] [0x33] [0x22] [0x11]
  • 主机字节序:一般主机当中使用小端字节序
  • 网络字节序:网络通信当中必须使用大端字节序

检测主机字节序

#include<stdint.h>#include<stdio.h>voidcheck_endianness(){uint32_tval32=0x11223344;uint8_tval8=*((uint8_t*)&val32);// 获取变量val32第一个字节的值// 通过判断val8的值是0x44或者0x11来确定主机字节序是大端还是小端if(val8==0x44){printf("本机是小端字节序\n");}elseif(val8==0x11){printf("本机是大端字节序\n");}else{printf("无法确定字节序\n");}}// ARM架构通常是:小端字节序// 网络传输必须是:大端字节序(网络字节序)

字节序转换函数

函数原型

#include<arpa/inet.h>// 主要头文件#include<netinet/in.h>// 备用头文件// ================ 主机到网络(Host to Network)================// 32位整数转换uint32_thtonl(uint32_thostlong);// 参数:hostlong - 主机字节序的32位整数// 返回值:网络字节序的32位整数// 16位整数转换uint16_thtons(uint16_thostshort);// 参数:hostshort - 主机字节序的16位整数// 返回值:网络字节序的16位整数// ================ 网络到主机(Network to Host)================// 32位整数转换uint32_tntohl(uint32_tnetlong);// 16位整数转换uint16_tntohs(uint16_tnetshort);

示例

#include<arpa/inet.h>#include<stdio.h>intmain(){// 1. 端口号转换(16位)uint16_thost_port=8080;uint16_tnet_port=htons(host_port);printf("主机端口: %d -> 网络端口: %d\n",host_port,net_port);// 2. IP地址转换(32位)uint32_thost_ip=0xC0A80101;// 192.168.1.1uint32_tnet_ip=htonl(host_ip);printf("主机IP: 0x%08X -> 网络IP: 0x%08X\n",host_ip,net_ip);return0;}

IP地址字符串与二进制转换

  • IP地址可能会存在“点分十进制”的字符串形式,转换之前需要注意
  • 主机字节序一般采用小端字节序
  • 网络字节序转主机字节序以后通常需要转换成“点分十进制”的字符串

传统转换函数(IPv4专用)

#include<arpa/inet.h>#include<stdio.h>#include<string.h>voidipv4_conversion_examples(){structin_addraddr;// ===== 方法1: inet_aton (ASCII to Network) =====// 将点分十进制字符串转换为网络字节序的二进制IPif(inet_aton("192.168.1.1",&addr)!=0){printf("inet_aton: 0x%08X\n",addr.s_addr);}// ===== 方法2: inet_addr (已废弃,不推荐使用) =====// 问题:无法区分错误返回和地址 255.255.255.255// in_addr_t ip = inet_addr("192.168.1.1");// ===== 方法3: inet_ntoa (Network to ASCII) =====// 将网络字节序的二进制IP转换为点分十进制字符串addr.s_addr=htonl(0xC0A80101);char*ip_str=inet_ntoa(addr);printf("inet_ntoa: %s\n",ip_str);// 输出: 192.168.1.1// 注意:inet_ntoa使用静态缓冲区,非线程安全!}

现代转换函数(支持IPv4/IPv6)

#include<arpa/inet.h>#include<stdio.h>#include<string.h>voidmodern_ip_conversion_examples(){// ===== IPv4 示例 =====structin_addripv4_addr;charipv4_str[INET_ADDRSTRLEN];// IPv4字符串缓冲区大小: 16// 字符串 -> 二进制 (Presentation to Numeric)if(inet_pton(AF_INET,"192.168.1.1",&ipv4_addr)==1){printf("IPv4二进制: 0x%08X\n",ipv4_addr.s_addr);}// 二进制 -> 字符串 (Numeric to Presentation)if(inet_ntop(AF_INET,&ipv4_addr,ipv4_str,INET_ADDRSTRLEN)!=NULL){printf("IPv4字符串: %s\n",ipv4_str);}// ===== IPv6 示例 =====structin6_addripv6_addr;charipv6_str[INET6_ADDRSTRLEN];// IPv6字符串缓冲区大小: 46if(inet_pton(AF_INET6,"2001:db8::1",&ipv6_addr)==1){printf("IPv6转换成功\n");}if(inet_ntop(AF_INET6,&ipv6_addr,ipv6_str,INET6_ADDRSTRLEN)!=NULL){printf("IPv6字符串: %s\n",ipv6_str);}}

线程安全的转换

#include<arpa/inet.h>#include<stdio.h>// 线程安全的IP地址转换函数intsafe_ip_conversion(constchar*ip_str,uint32_t*ip_bin){structin_addraddr;if(inet_pton(AF_INET,ip_str,&addr)!=1){// 转换失败return-1;}*ip_bin=addr.s_addr;// 已经是网络字节序return0;}voidsafe_ip_to_string(uint32_tip_bin,char*buffer,size_tbuffer_size){structin_addraddr;addr.s_addr=ip_bin;if(inet_ntop(AF_INET,&addr,buffer,buffer_size)==NULL){// 转换失败,设置空字符串buffer[0]='\0';}}

跨平台字节序处理

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 3:49:25

提示工程架构设计实战:旅游行业智能推荐提示系统架构设计全流程

提示工程架构设计实战&#xff1a;旅游行业智能推荐提示系统架构设计全流程 一、标题选项 《提示工程落地指南&#xff1a;旅游行业智能推荐系统架构设计全流程》《从0到1&#xff1a;旅游行业智能推荐提示系统架构实战解析》《旅游推荐智能化&#xff1a;基于提示工程的系统…

作者头像 李华
网站建设 2026/5/1 4:45:10

Java计算机毕设之基于springboot的养老院管理系统的设计与实现基于SpringBoot的养老中心管理系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/1 3:47:18

网页爬虫与DOM操作:Puppeteer与Cheerio的实战应用

在现代网络应用开发中,网页爬虫和DOM操作是两个常见却又复杂的领域。通过Puppeteer和Cheerio,我们可以有效地抓取并处理网页内容。本文将介绍如何使用这两个工具来移除HTML中不包含文本的元素,并展示一个具体的实例。 背景介绍 Puppeteer是一个Node库,提供了高级API来控制…

作者头像 李华
网站建设 2026/5/1 6:51:49

2026必备!10个AI论文写作软件,助本科生轻松写论文!

2026必备&#xff01;10个AI论文写作软件&#xff0c;助本科生轻松写论文&#xff01; AI 工具如何改变论文写作的未来 在当今信息爆炸的时代&#xff0c;学术写作正面临前所未有的挑战。对于本科生而言&#xff0c;撰写一篇高质量的论文不仅需要扎实的专业知识&#xff0c;更需…

作者头像 李华