首页 > 其他分享 >网络字节序和本地字节序之间转换

网络字节序和本地字节序之间转换

时间:2024-06-04 21:34:38浏览次数:16  
标签:转换 字节 主机 网络 本地 IP地址 inet

网络字节序和本地字节序之间转换

目录

当我们与同一台计算机的进程进行通信时,一般不用考虑字节序。什么是字节序——字节序是一个处理器架构特性,用于指示像整数这样的大数据类型内部的字节如何排序。
考虑一个16位整数,它由2个字节组成。内存中存储这两个字节有2种方法:一种是将低序字节存储在起始地址,这称为小 端字节序;另一种方法 是将高 字节序存储在起始地址,这称为大端字节序。

主机字节序

这两种字节序之间没有标准可循,两种格式都有系统使用。有些处理器可以配置成大端的,也可以配置成小端的。我们把某个给定系统所使用的字节序称为主机字节序。

网络字节序

网络协议指定了字节序,因此异构计算机系统能够交换协议信息而不会被字节序所混淆。TCP/IP协议栈使用大端字节序。应用程序交换格式化数据时,字节序问题就 会出现。对于TCP/IP,地址用网络字节序来表示,所以应用程序有时需要在处理器的字节序与网络字节序之间转换它们。

相关函数htons, htonl, ntohs, 和 ntohl

为了统一发送数据的格式,所以互联网传输的数据统一采用大端方式,为了方便开发,linux系统提供了转换的接口:htonl、htons、ntohl、ntohs。 h :host (主机/本地)、to: (转换)、n :net(网络)、l :long(长整型)、s :short (短整型)

这些函数用于在主机字节序和网络字节序之间转换16位或32位数值。htonshtonl用于将主机字节序的值转换为网络字节序,而ntohsntohl则相反,用于将网络字节序的值转换为主机字节序。这些转换在网络通信中非常重要,因为不同的机器可能有不同的字节序,而网络协议通常使用网络字节序。

#include <netinet/in.h>

// htons - 主机字节序转网络字节序(16位)
uint16_t htons(uint16_t host16bitvalue);

// htonl - 主机字节序转网络字节序(32位)
uint32_t htonl(uint32_t host32bitvalue);

// ntohs - 网络字节序转主机字节序(16位)
uint16_t ntohs(uint16_t net16bitvalue);

// ntohl - 网络字节序转主机字节序(32位)
uint32_t ntohl(uint32_t net32bitvalue);

函数表格

函数名 描述 参数 返回值 用法
htonl() 主机字节序转网络字节序(32位) uint32_t hostlong:本地字节序的32位数 网络字节序的32位数 用于将IPv4地址从主机字节序转换为网络字节序
htons() 主机字节序转网络字节序(16位) uint16_t hostshort:本地字节序的16位数 网络字节序的16位数 用于将端口号从主机字节序转换为网络字节序
ntohl() 网络字节序转主机字节序(32位) uint32_t netlong:网络字节序的32位数 本地字节序的32位数 用于将IPv4地址从网络字节序转换为主机字节序
ntohs() 网络字节序转主机字节序(16位) uint16_t netshort:网络字节序的16位数 本地字节序的16位数 用于将端口号从网络字节序转换为主机字节序

相关函数inet_aton, inet_ntoa, inet_pton, 和 inet_ntop

af参数代表地址族,对于IPv4是AF_INET,对于IPv6是AF_INET6srcdst分别代表源地址字符串和目标地址结构。inet_ptoninet_ntop是更现代的函数,它们支持IPv6地址的转换。

#include <arpa/inet.h>

// inet_aton - 将点分十进制的IP地址转换为网络字节序的二进制形式
int inet_aton(const char *cp, struct in_addr *inp);

// inet_ntoa - 将网络字节序的二进制IP地址转换为点分十进制的字符串形式
char *inet_ntoa(struct in_addr in);

// inet_pton - 将点分十进制的IP地址转换为网络字节序的二进制形式
int inet_pton(int af, const char *src, void *dst);

// inet_ntop - 将网络字节序的二进制IP地址转换为点分十进制的字符串形式
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

网络函数表格

函数表格

函数名 描述 参数 返回值 用法
inet_aton 将点分十进制的IP地址转换为网络字节序的二进制结构 const char *cp:点分十进制的IP地址字符串
struct in_addr *inp:存储转换后的IP地址
成功时返回非零值,失败时返回0 用于IPv4地址转换,现已较少使用,推荐使用inet_pton
inet_ntoa 将网络字节序的二进制IP地址转换为点分十进制的字符串 struct in_addr in:网络字节序的IP地址结构 点分十进制的IP地址字符串 用于IPv4地址转换,现已较少使用,推荐使用inet_ntop
inet_pton 将点分十进制的IP地址转换为网络字节序的二进制结构 int af:地址族(如AF_INETAF_INET6
const char *src:IP地址字符串
void *dst:存储转换后的IP地址
成功时返回1,输入不是有效的地址格式时返回0,出错时返回-1 支持IPv4和IPv6地址转换,是inet_aton的更通用和安全的替代品
inet_ntop 将网络字节序的二进制IP地址转换为点分十进制的字符串 int af:地址族(如AF_INETAF_INET6
const void *src:网络字节序的IP地址
char *dst:存储转换后的IP地址字符串
socklen_t size:目标存储空间的大小
成功时返回指向结果的指针,失败时返回NULL 支持IPv4和IPv6地址转换,是inet_ntoa的更通用和安全的替代品

这些函数之间的主要区别在于它们处理的数据类型和转换的方向。

inet_ntoa()inet_aton()专门用于IPv4地址的字符串表示,而其他四个函数用于通用的数值类型的字节序转换。

inet_pton()inet_ntop(),这两个函数支持IPv4和IPv6地址的转换,用于点分十进制的字节转换。

inet_pton() 用于将点分十进制的IP地址转换为网络字节序的二进制形式,

inet_ntop() 用于将网络字节序的二进制IP地址转换为点分十进制的字符串形式

标签:转换,字节,主机,网络,本地,IP地址,inet
From: https://www.cnblogs.com/banon/p/18231794

相关文章

  • 2024最新拼多多Java面试题(现场五面),全面涵盖Java高级到高并发,字节跳动java面试算法没
    总结其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。这里还有一份很不错的《Java基础核心总结笔记》,......
  • 进制转换
    voiddecToBinary(intdecimal){intbinary[32];intcnt=0;while(decimal>0){binary[cnt]=decimal%2;//取模放在低位decimal=decimal/2;//更新参数cnt++;}printf("Binaryequivalent:"......
  • 本地服务调用遇到的问题
    1、我本地起了两个服务8087和8086单独在浏览器是都可以访问  2、在postman中单独调用8087的一个接口没有问题 3、但是在8086服务中调用这个接口http://localhost:8087/api/account/login就会超时 4、如果把这个接口http://localhost:8087/api/account/login换成手......
  • Transgaga——人脸与猫脸之间互相转换算法解析
    1.概述虽然pix2pix作为风格转换模型被提出,但它依赖于成对的数据集。与之相比,CycleGAN通过引入循环损失,实现了无需配对数据的风格转换。不过,CycleGAN在处理需要大幅几何变化的风格转换时表现不佳,仅在如马和斑马这类颜色变化的场景中有效。2018年,MUNIT利用变分自编码器(VAE)......
  • pdf如何转换成excel文档?这3个方法免费!
    职场人士常常会遇到PDF文件格式,因为PDF便于传输且能够保持排版稳定,因此在文件分享中备受青睐。然而,PDF文件中的表格数据可能涉及到公式和函数,而PDF格式又不易编辑,这时我们就需要将其转换为Excel格式进行编辑修改。因此,掌握PDF转换成Excel的技能对职场人士来说非常有意义。幸运的......
  • C++ 强制类型转换运算符简介
    C++提供了四种强制类型转换运算符:static_cast、reinterpret_cast、const_cast和dynamic_cast。这些运算符各自具有特定的用途,适用于不同的类型转换需求。本文将详细介绍这四种运算符及其应用场景,并讨论它们在向上转换中的使用方法。1.static_caststatic_cast用于在编译时执......
  • 飞睿uwb定位tag防丢器,蓝牙智能防丢器原理,支持苹果IOS的本地防丢查找
    在当今这个快节奏的社会,人们的注意力经常被各种琐事分散,丢三落四的情况时有发生。随着科技的发展,智能防丢器应运而生,成为帮助我们解决这一烦恼的助手。今天,我们就来深入探讨一款备受瞩目的智能防丢产品——飞睿UWB定位Tag防丢器,它不仅结合了新的蓝牙技术,还拥有自己的APP,支持苹......
  • python 字节转化为字符串
    str()在字节转化为字符串时,需要显式地提供encoding参数,否则返回的非正式的字符串表示。官方文档是这样说的:还可以使用decode()方法来将字节转化为字符串参考资料:Pythonstr()——将数据转换为字符串(freecodecamp.org)来自为知笔记(Wiz)......
  • 用fiddler调试本地接口线上项目
    1.打开fiddler编辑脚本,找到OnBeforeRequest处添加代码,点击保存代码按钮使其生效,开启fiddler监控//外网转内网https转httpif(oSession.HostnameIs('www.demo.cn')){if(oSession.isHTTPS){oSession.fullUrl=oSession.fullUrl.Replace("https://","http://"......
  • 使用ollama部署本地大模型
    安装docker与docker-compose安装ollama与anythingllmdocker-compose.ymlversion:"3"services:ollama:image:ollama/ollamacontainer_name:ollamavolumes:-.ollama:/root/.ollamaports:-11434:11434anythingllm:i......