当前位置: 首页 > news >正文

字节序及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';}}

跨平台字节序处理

http://www.jsqmd.com/news/295022/

相关文章:

  • LeetCode 134. 加油站(O(n)时间+O(1)空间最优解)
  • 【计算机毕业设计案例】基于Springboot的幼儿园综合管理系统基于springboot的幼儿园管理系统基于SpringBoot+Vue的幼儿园管理系统(程序+文档+讲解+定制)
  • 提示工程架构设计实战:旅游行业智能推荐提示系统架构设计全流程
  • 【计算机毕业设计案例】基于Java的养老院管理系统的设计与实现基于springboot的养老院管理系统的设计与实现(程序+文档+讲解+定制)
  • 深度学习篇---初看transformer
  • 固高控制板卡驱动安装教程
  • 基于大数据的图书推荐系统的设计与实现-计算机毕业设计源码+LW文档
  • 学术研究的第一步不再困难,AI工具助你轻松优化开题报告模板内容
  • 想要高效完成学术写作?这份AI辅助的开题报告模板是你的最佳选择
  • Java毕设选题推荐:基于springboot的幼儿园管理系统基于springboot的实验幼儿园信息管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 区间并查集|树状数组
  • 计算机Java毕设实战-基于springboot的幼儿园管理系统基于Springboot的幼儿园综合管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 【课程设计/毕业设计】基于springboot+vue的实验幼儿园信息管理系统基于springboot的幼儿园管理系统【附源码、数据库、万字文档】
  • Java计算机毕设之基于SpringBoot+Vue的幼儿园管理系统基于springboot的幼儿园管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • Expo+React Native实现鉴权
  • Java毕设项目推荐-基于springboot的养老院管理系统的设计与实现基于SpringBoot+Vue的养老院管理系统【附源码+文档,调试定制服务】
  • Java毕设项目推荐-基于Springboot的幼儿园综合管理系统基于springboot的幼儿园管理系统【附源码+文档,调试定制服务】
  • 随笔-无具体内容
  • 吐血推荐!继续教育10款AI论文平台测评与推荐
  • 2026.1.24 作业 - # P14317 「ALFR Round 11」A 浴眼盯真 (dingzhen)
  • 深度测评专科生必用8款一键生成论文工具:开题报告文献综述全攻略
  • 这份AI支持的开题报告模板,能帮助你在学术研究中节省宝贵时间
  • 【AI经典论文解读】《High-Resolution Image Synthesis with Latent Diffusion Models(基于潜在扩散模型的高分辨率图像合成)》论文深度解读
  • 学术研究的起点很关键,AI优化的开题报告模板能帮你快速上手
  • 风电传动系统故障特征分析与诊断【附代码】
  • 收益可视化营销:如何用“55万收益案例”吸引创业者?
  • 油动机液压系统异常检测与轻量化故障诊断【附代码】
  • 计算机Java毕设实战-基于springboot+vue好生活养老院管理系统基于springboot的养老院管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Java毕设项目:基于springboot的养老院管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 【课程设计/毕业设计】基于SpringBoot+Vue的养老院管理系统基于springboot的养老院管理系统的设计与实现【附源码、数据库、万字文档】