python 网络字节序转换_网络字节序

python 网络字节序转换_网络字节序一 字节序字节序是由于不同的主处理器和操作系统 对大于一个字节的变量在内存中的存放顺序不同而产生的 字节序通常有大端字节序列和小端字节序两种分类方法 由于主机的千差万别 主机的字节序不能做到统一 但是网络上传输的数值 它们有统一的规定 网络字节序 是指多字节变量在网络传输时的表示方法 网络字节序采用高端字节序的表示方法 高位在前 低位在后 这是针对一个变量所处的字节中来说的 比如一个变量占两个字节

一.字节序

字节序是由于不同的主处理器和操作系统,对大于一个字节的变量在内存中的存放顺序不同而产生的。

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

由于主机的千差万别,主机的字节序不能做到统一,但是网络上传输的数值,它们有统一的规定。网络字节序:是指多字节变量在网络传输时的表示方法,网络字节序采用高端字节序的表示方法(高位在前,低位在后,这是针对一个变量所处的字节中来说的,比如一个变量占两个字节,则该变量的第一个字节值应该放在它所对应的内存中的高位字节)。

二.大端字节序和小端字节序

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

1.brief introduce:

一个16位的整数,它由两个字节构成,在有的系统上会将高字节放在内存的低地址上,而有的系统上则将高字节放在内存的高地址上,所以存在字节序的问题。

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

1>小端字节序(Little

Endian):在表示变量的内存起始地址存放底字节,高字节顺序存放

2>大端字节序(Big

Endian):在表示变量的内存起始地址存放高字节,底字节顺序存放。

3实例:

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

1>在小端字节系统中的存放顺序如图:

a4c26d1e5885305701be709a3d33442f.png

0xab在地址15~8的地址上,而0xcd在地址7~0的位置上。

2>在大端字节序系统中的存放顺序如图:

a4c26d1e5885305701be709a3d33442f.png

4.程序实例:

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

(1)字节序结构:

程序先建立一个公用体类型address,用于测试字节序,成员value是int

类型变量,可以通过成员byte来访问value变量的高字节和低字节。

typedef

union{

unsigned int value;

unsigned char byte[2];

}addr;

(2)变量声明,声明一个to类型的变量typeordr,给变量value赋值为0xabcd,由于在类型addr中,value和byte成员共享同一块内存,所以可以通过byte的不同成员来访问value的高字节和低字节。

(3)程序:

int main(int

argc,char *argv)

{

addr typeorder;//一个to类型的变量

typeorder.value=

0xabcd;

if(typeorder.byte[0] == 0xcd

&&typeorder.byte[1]==0xab){

printf(“Low endian bye

order\n”);

printf(“byte[0]:0x%x,byte[1]:0x%x\n”,typeorder.byte[0],typeorder.byte[1]);

}

if(typeorder.byte[0] == 0xab

&&typeorder.byte[1]==0xcd){

printf(“High

endian byte order\n”);

printf(“byte[0]:0x%x,byte[1]:0x%x\n”,typeorder.byte[0],typeorder.byte[1]);

}

return

0;

}

5.进行网络字节序转换的函数有htons,htonl,ntohs(),ntohl()等,其中s表示short数据类型,l是long数据类型的意思,h是host既主机的意思,n是network即网络的意思。

1>htons(host to net

short):表示对short类型的变量,从主机字节序转换为网络字节序。

2>ntohs(net to host

short):表示对short类型的变量,从网络字节序转换为主机字节序。

3>htonl(host to net

long):表示对long类型的变量,从主机字节序转换为网络字节序

4>ntohl(net to host

long):表示对long类型的变量,从网络字节序转换为主机字节序。

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

例如:通过下面的实现方式可以兼容不同的平台:

#if ISLE

long htonl(longvalue)

{

Return ((value << 24) |

((value <<8)&0x00ff0000)

|((value>>8)&0x0000ff00)|(value>>24));

}

#else if

ISBE

long

htonl(longvalue)

{

return  value;

}

#endif

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202523.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午11:56
下一篇 2026年3月19日 下午11:56


相关推荐

  • 重定向和转发的区别及应用_重定向发给别人能看见吗

    重定向和转发的区别及应用_重定向发给别人能看见吗重定向和转发的区别:一:重定向与转发的区别1.重定向过程:客户端浏览器发送http请求→web服务器接收后发送30X状态码响应及对应新的location给客户浏览器→客户浏览器发现是30X响应,则自动再发送一个新的http请求,请求url是新的location地址→服务器根据此请求寻找资源并发送给客户。//java代码示例response.sendRedirect(“xxx.jsp或者servlet”);2.转发过程:客户端浏览器发送http请求→web服务器接受此请求→

    2025年10月8日
    5
  • msyql多个or,and,

    msyql多个or,and,

    2022年3月3日
    45
  • css图片居中(水平居中和垂直居中)

    css图片居中(水平居中和垂直居中)css 图片居中 水平居中和垂直居中 css 图片居中分 css 图片水平居中和垂直居中两种情况 有时候还需要图片同时水平垂直居中 下面分几种居中情况分别介绍 css 图片水平居中利用 margin 0auto 实现图片水平居中利用 margin 0auto 实现图片居中就是在图片上加上 css 样式 margin 0auto 如下 divstyle text align center width 500px border greensolid1p divstyle text align center width 500px border greensolid1p

    2025年6月23日
    6
  • n8n自动化测试教程 (1):环境搭建与初识n8n

    n8n自动化测试教程 (1):环境搭建与初识n8n

    2026年3月13日
    1
  • Django(67)drf搜索过滤和排序过滤

    Django(67)drf搜索过滤和排序过滤前言当我们需要对后台的数据进行过滤的时候,drf有两种,搜索过滤和排序过滤。搜索过滤:比如我们想返回sex=1的,那么我们就可以从所有数据中进行筛选排序过滤:比如我们想对价格进行升序排列,就可以

    2022年7月30日
    10
  • 高通9008刷机,刷机参考

    高通9008刷机,刷机参考警告 本教程仅供参考 刷机有风险 责任自负总结 用这个方法要满足两个最基本条件 否则不用尝试了 1 能找到 QPST 专用刷机包 2 确认手机能进 9008 端口运行环境和系统要求 Win7 以上系统 32 位和 64 位皆可 本帖演示 win7x64 系统 内存至少 2GB 以上 安装高通 HS USB 驱动 安装 net4 0 以上版本 安装 VC 运行环境高通 QPST 救砖教程 软件安装过程中 如果出现询问驱动不安全 是否安装时 一定要点始终安装

    2026年3月19日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号