首页 > 其他分享 >网络字节序与主机字节序的转换函数实践

网络字节序与主机字节序的转换函数实践

时间:2022-10-08 13:23:05浏览次数:53  
标签:转换 字节 主机 网络 地址 un 函数

网络字节序与主机字节序的转换函数实践

     在Linux网络编程中,经常碰到网络字节序与主机字节序的相互转换。说到网络字节序与主机字节序需要清晰了解以下几个概念。

主机字节序

    字节序,是字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前。比如一个int32_t类型的数值占用4个字节,这4个字节在内存中的排列顺序就是字节序。字节序可以分为两种:
  (1)小端字节序(Little endinan),数值低位存储在内存的低地址,高位存储在内存的高地址;
  (2)大端字节序(Big endian),数值高位存储在内存的低地址,低位存储在内存的高地址。
以32位位宽数值0x12345678为例,小端字节序与大端字节序具体的存储区别如下所示:
image

小端模式优点 :

    强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。

大端模式优点 :

    符号位的判定固定为第一个字节,容易判断正负。

网络字节序

    网络数据流也有大小端之分。
    网络数据流的地址规定:先发出的数据是低地址,后发出的数据是高地址。发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,为了不使数据流乱序,接收主机也会把从网络上接收的数据按内存地址从低到高的顺序保存在接收缓冲区中。TCP/IP协议规定:网络数据流应采用大端字节序,即低地址高字节。

大小端转换

常用的转换函数:

函数原型 函数说明
uint16_t htons(uint16_t hostshort); 将 16 位的主机字节序转换为网络字节序
uint32_t htonl(uint32_t hostlong); 将 32 位的主机字节序转换为网络字节序
uint16_t ntohs(uint16_t netshort); 将 16 位的网络字节序转换为主机字节序
uint32_t ntohl(uint32_t netlong); 将 32 位的网络字节序转换为主机字节序

其中

  1. uint16_t:无符号的 16 位整数(等同于 unsigned short)
  2. uint32_t:无符号的 32 位整数(等同于 unsigned int)
点击这里,通过以下代码可以查看自己电脑是大端还是小端
#include<stdio.h>

int main(int argc, char** argv)
{
	union {
		short  s;
		char   c[sizeof(short)];
	} un;
 
	un.s = 0x0102;
	if (sizeof(short) == 2) {
		if (un.c[0] == 1 && un.c[1] == 2)
			printf("big-endian\n");
		else if (un.c[0] == 2 && un.c[1] == 1)
			printf("little-endian\n");
		else
			printf("unknown\n");
	}
	return 0;
}

标签:转换,字节,主机,网络,地址,un,函数
From: https://www.cnblogs.com/ouyan-/p/16768634.html

相关文章

  • 网络字节序与主机字节序的转换
    网络字节序的转换:端口port:ntohs()//网络字节序转主机字节序ntohl()htons()......
  • 网络字节序与主机字节序转换函数实践
    字节序基础概念字节序,顾名思义,指字节在内存中存储的顺序。比如一个int32_t类型的数值占用4个字节,这4个字节在内存中的排列顺序就是字节序。字节序有两种:(1)小端字节序(Little......
  • 指针与函数
    1.通过指针变量访问整型变量#include<stdio.h>intmain(){inta,b;int*p1,*p2;scanf("a=%d,b=%d",&a,&b);p1=&a;p2=&b;printf("*p1=......
  • 攻防世界Web_php_unserialize(__wakeup函数绕过)
    <?phpclassDemo{private$file='index.php';publicfunction__construct($file){$this->file=$file;}function__destruct(){......
  • js高级ES6class构造函数与super继承
    <!DOCTYPEhtml><htmllang="en"><head> <metacharset="UTF-8"> <metahttp-equiv="X-UA-Compatible"content="IE=edge"> <metaname="viewport"content="width=......
  • JavaScript高级复习——构造函数和原型
    构造函数JavaScript的构造函数中可以添加一些成员,可以在构造函数本身上添加,也可以在构造函数内部的this上添加。通过这两种方式添加的成员,就分别称之为静态成员和实例成员......
  • [转]为什么VS提示SurfFeatureDetector不是cv的成员函数
    surf和sift算法都是在头文件#include<opencv2/features2d/features2d.hpp>中,但在新的opencv版本出来后,如果仍然使用这个头文件就会出现编译错误如下:'SurfFeatureDetector......
  • 网络字节序和主机字节序的转换函数实践
    1、什么是字节序计算机在储存数据时有两种储存数据的方式:大端字节序(bigendian)和小端字节序(littleendian)1.大端字节序(bigendian)大端字节序(bigendian)是将值的高位......
  • 常用的 函数式接口
    函数式接口:将注解@FunctionalInterface放在一个接口上,编译器会帮我们检查这个接口是否亿实业韩式接口 JDK提供的常见函数式接口:所在包:java.util.function ......
  • BufferedOutPutStream字节输出流
    字节输出流构造方法:BufferedOutPutStream(OutPutStreamout)BufferedOutPutStream(OutPutStreamout,intsize)参数:OutPutStreamout:字节输出流,可以传递OutPutS......