首页 > 编程知识 正文

网络字节序在线转换,字节序

时间:2023-05-05 03:49:16 阅读:162633 作者:4749

网络字节顺序

1 .字节序

发生字节顺序是因为,根据主处理器和操作系统的不同,大于1字节的变量在内存中的存储顺序也不同。

字节序通常有两种分类方法:大字节序和小字节序。

由于主机千差万别,无法统一主机的字节序,但在网络上传输的数值有统一的规定。 网络端序是指在网络上传输多字节变量时的一种表示方法,网络端序采用的是高端端序的表示方法。

2 .大字节序和小字节序

字节序是因为相对于多字节变量的CPU和OS的内存存储顺序不同而产生的。

1.briefintroduce:

是由2字节构成的16位整数,在某些系统中将高位字节配置在存储器的低位地址,在某些系统中将高位字节配置在存储器的高位地址,因此存在字节序问题。

2 .字节序的表示方法有两种。

1小字节序(Little Endian ) :将底部字节和高端序存储在表示变量的存储器的开头地址中

2-big endian (big endian ) :按高度、底部字节的顺序存储在表示变量的存储器的起始地址中。

3实例:

一个变量的值为0xabcd,在大字节序和小字节序的系统中,两者的存储顺序不同。

1小字节序系统的存储顺序如图:所示

0xab位于地址15~8处,0xcd位于地址7~0处。

2在大字节序系统中的存储顺序如图:所示

4 .程序示例:

您可以编写一个程序来检测内存中变量的表示形式,以确定系统中的字节序是大字节序还是小字节序。

(1)端序结构:

程序首先创建用于测试字节序的实用程序类型address。 成员value是int类型变量,成员byte可以访问value变量的高位字节和低位字节。

typedef union{

无符号安装;

unsigned char byte[2];

}addr;

)2)变量声明声明to型变量typeordr,并将0xabcd分配给变量value。 在类型addr中,value和byte成员共享相同的内存,因此byte的不同成员可以访问value的高位字节和低位字节。

(3)程序:

intmain(intargc,char *argv ) ) ) ) ) ) ) ) ) ) ) )。

{

addr typeorder; //to型变量

typeorder.value=0xabcd;

/*小端序的端序校验*

type order.byte (0)==0xCDtypeorder.byte(1)==0xab ) {

printf(「lowEndianbyeordern " );

printf(「byte[0]:0x%x,byte[1]:0x%xn”,typeorder.byte[0],typeorder.byte[1] );

() ) ) ) )。

/*大字节序判定*

类型订单. byte (0)==0xabtypeorder.byte(1)==0xCD ) {

printf(「highEndianbyteordern "

printf(「byte[0]:0x%x,byte[1]:0x%xn”,typeorder.byte[0],typeorder.byte[1] );

() ) ) ) )。

返回0;

() ) ) ) )。

5 .用于对网络进行字节序转换的函数包括htons、htonl、ntohs (,ntohl )等。 其中s表示短数据类型,l表示长数据类型,h表示host现有主机,n表示网络或网络。

1htons(hosttonetshort ) :表示短类型的变量将从主机字节序转换为网络字节序。

2ntohs(nettohostshort ) :表示短类型的变量将从网络字节顺序转换为主机字节顺序。

3htonl(hosttonetlong ) :表示长类型的变量,从主机字节顺序转换为网络字节顺序

4ntohl(nettohostlong ) :表示long类型的变量将从网络字节顺序转换为主机字节顺序。

6 .由于网络中的字节序采用的是高端字节序的表示方法。 因此,不同的平台实现不同的字节序转换函数,它们在小字节序字节序平台上进行转换,而在大字节序字节序平台上不需要进行转换。

例如,以下实现方式与不同的平台兼容:

#if ISLE

/*小端序平台调用部分代码*

长整型(长整型)。

{

return((|(value24 )value8)0x00ff0000 )|)0x0000ff00 )value24 ) );

() ) ) ) )。

#else if ISBE

/*大端序平台调用部分代码*

长整型(长整型)。

{

/*由于字节序匹配,因此不需要转换*

返回值;

() ) ) ) )。

#endif

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。