news 2026/10/23 15:27:35

字节序及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/10/22 20:30:41

YOLO26改进 - SPPF模块 | AIFI基于注意力的尺度内特征交互:替代SPPF构建高效混合编码器,提升模型综合效能

前言 本文介绍了实时检测Transformer&#xff08;RT-DETR&#xff09;及其核心AIFI模块在YOLO26中的结合应用。RT-DETR旨在解决YOLO速度和准确性受NMS负面影响、DETRs计算成本高的问题&#xff0c;通过设计高效混合编码器和解码器层数调整来提升性能。AIFI作为Transformer编码…

作者头像 李华
网站建设 2026/10/19 9:54:06

随笔-无具体内容

本文聚焦数字化新业态下的数据安全创新技术Token化&#xff0c;核心是用非敏感Token替代个人敏感数据&#xff08;PII&#xff09;流通&#xff0c;实现“可用、不可见”&#xff0c;解决数据安全与效率合规的矛盾。 文中先分析数字化时代数据的流动性、可复制性等特征带来的安…

作者头像 李华
网站建设 2026/10/19 9:54:06

基于微信小程序的校园食堂美食点餐系统

目录系统概述核心功能技术实现创新点应用价值项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作系统概述 校园食堂美食点餐系统基于微信小程序开发&#xff0c;旨在为学生和教职工提供便捷的线上点餐服务。系…

作者头像 李华
网站建设 2026/10/22 23:25:14

深入解析Bash脚本执行中的常见坑

在编写和执行Bash脚本的过程中,程序员们经常会遇到一些看似简单但实际上并不直观的问题。今天,我们将通过一个实际的例子来深入探讨这些问题,特别是关于脚本执行环境的选择和影响。 问题背景 假设你有一个简单的Bash脚本,其目的在于从用户那里安全地获取密码输入。下面是…

作者头像 李华
网站建设 2026/10/19 9:54:14

元宇宙商业中AI大模型的应用架构:应用架构师的落地指南

元宇宙商业中AI大模型的应用架构:应用架构师的落地实战指南 标题备选 《元宇宙商业AI架构落地指南:应用架构师的核心方法论》 《从概念到营收:元宇宙+AI大模型的商业应用架构设计》 《元宇宙商业中的AI大模型架构:应用架构师必看的落地路径》 《拆解元宇宙商业AI架构:大模…

作者头像 李华