在上一篇文章网络编程:主机字节序和网络字节序中,介绍了主机字节序和网络字节序的基本概念以及在实际的编程中,何时需要进行网络字节序和主机字节序的转换。本篇文章着重介绍使用c++和python语言,如何实现主机字节序和网络字节序的相互转换。首先回顾一下主机字节序和网络字节序的概念:

主机字节序就是自己的主机内部,内存中数据的处理方式,要么是大端,要么是小端,取决于处理器类型和操作系统类型,和编程语言无关,如何判断主机的主机字节序是大端还是小端,请参见网络编程:主机字节序和网络字节序第4节中代码。

   网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。在c++和python中,有4个函数可以实现主机字节序到网络字节序的相互转换,如下:

   htons: 把unsigned short类型从主机序转换到网络序
   htonl: 把unsigned long类型从主机序转换到网络序
   ntohs: 把unsigned short类型从网络序转换到主机序
   ntohl: 把unsigned long类型从网络序转换到主机序

  注意:1) 在使用little endian的系统中 这些函数才会把字节序进行转换 ; 在使用big
endian类型的系统中 上述4个函数会定义成空宏,即不会进行任何字节序的任何转换。

     2) 在小端系统中,只有像int、long等多字节类型的数据在网络传输中才需要进行字节序转换。

  接下来,介绍一下在linux和windows平台下c++如何实现字节序转换以及python语言如何实现字节序转换。我用的机器是小端字节序。

  1.linux + c++ 实现主机字节序和网络字节序的转换代码

 #include <arpa/inet.h>    //1.包含arpa/inet.h
#include <stdio.h>
int main()
{
int port=;
int netPort=htonl(port);
printf("netPort=%d\n",netPort);
printf("hostPort=%d\n",ntohl(netPort));
return ;
} output:
  netPort=1880555520
  hostPort=6000 

  2.windows + c++ 实现主机字节序和网络字节序的转换代码

 1 #include <stdio.h>
2 #include <Winsock2.h> //1.包含<Winsock2.h>,
3 #pragma comment( lib, "ws2_32.lib") //2.引入ws2_32.lib库
4 void main()
5 {
6 int port=6000;
7 int netPort=htonl(port);
8 printf("netPort=%d\n",netPort);
9 printf("hostPort=%d\n",ntohl(netPort));
10 } output:
  netPort=1880555520
  hostPort=6000 

  3.python 语言实现主机字节序和网络字节序的转换代码

   python语言现在有两种方法(我所知道的)实现主机字节序和网络字节序的转换,一种是通过htons、htonl、ntohl和ntohs等函数实现,另一种是通过struct模块的pack和unpack函数实现,关于struct模块的pack和unpack函数的使用方式,请参考我的一篇文章:python中struct.pack()函数和struct.unpack()函数

     3.1 htons、htonl、ntohl和ntohs等函数实现字节序转换

 #!/usr/bin/python
#coding=utf-8
import socket
port = 6000
netPort = socket.htonl(port)
hostPort = socket.ntohl(netPort)
print"netPort:", netPort
print"hostPort:", hostPort output:
  netPort: 1880555520
  hostPort: 6000

     3.2 struct模块的pack和unpack函数实现字节序转换  

 #!/usr/bin/python
#coding=utf-8
from struct import *
port = 6000
netPort = pack(">i",port) #等价于htonl(port),只不过pack返回值是字符串类型
hostPort = unpack(">i",netPort)
print "netPort:",repr(netPort)
print "hostPort:",repr(hostPort[0]) output:
  netPort: '\x00\x00\x17p'
  hostPort: 6000

  至此,关于网络编程中的主机字节序和网络字节序的相关知识点和内容已接近尾声,有时间的话会继续探讨一下如何使用c++模拟实现htonl等字节序转换函数。

c++和python如何实现主机字节序和网络字节序的相互转换的更多相关文章

  1. Python网络编程——主机字节序和网络字节序之间的相互转换

    If you ever need to write a low-level network application, it may be necessary to handle the low-lev ...

  2. 【网络编程一】主机字节序与网络字节序以及ip地址转换函数

    在计算机设计之初,对内存中数据的处理也有不同的方式,(低位数据存储在低位地址处或者高位数据存储在低位地址处),然而,在通信的过程中(ISO/OSI模型和TCP/IP四层模型中),数据被一步步封装(然后 ...

  3. linux程序设计——主机字节序和网络字节序(第十五章)

    15.2.10    主机字节序和网络字节序 当在基于intel处理器的linux机器上执行新版本号的server和客户程序时,能够用netstat命令查看网络连接状况.它显示了客户/server连接 ...

  4. TCP/IP网络编程之字节序和网络字节序

    一.概要 本篇文章主要讲解基于.net中tcp/ip网络通信编程中的网络字节序.在自我进步的过程中记录这些内容,方便自己记忆的同时也希望可以帮助到大家.技术的进步源自于分享和不断的自我突破. 技术交流 ...

  5. 大端字节序&小端字节序(网络字节序&主机字节序)

    大端字节序:整数的高位字节存储在内存的低地址处,低字节存储在内存的高地址处. 小端字节序:整数的高位字节存储在内存的高地址处,低字节存储在内存的低地址处. 一般pc大多采用小端字节序,也称为主机字节序 ...

  6. 为什么只有ip地址和端口号需要主机字节序到网络字节序的转换?

    答复是:因为内容是二进制流,不是整数. 整数(int.uint16.uint32)的表达,是需要多字节的,在不同cpu上,字节次序是不同的.因此,从A主机到B主机,如果是异构的,就需要做字节调整.同构 ...

  7. c# 主机和网络字节序的转换 关于网络字节序和主机字节序的转换

    最近使用C#进行网络开发,需要处理ISO8583报文,由于其中有些域是数值型的,于是在传输的时候涉及到了字节序的转换. 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有两种字节顺序, ...

  8. TCP和UDP的区别与联系以及网络字节序和主机字节序的转换函数实践

    TCP和UDP的区别 TCP是一个面向连接的.可靠的.基于字节流的传输层协议. 而UDP是一个面向无连接的传输层协议. 具体来分析,和 UDP 相比,TCP 有三大核心特性: 面向连接:所谓的连接,指 ...

  9. LITTLE-ENDIAN(小字节序、低字节序) BOM——Byte Order Mark 字节序标记 数据在内存中的存放顺序

    总结: 1. endian 字节存放次序 字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了). 2. LITTLE-ENDIA ...

随机推荐

  1. 复习1背包dp

    背包问题是对于一个有限制的容器,一般计算可以装的物品的价值最值或数量.通常每个物品都有两个属性空间和价值,有时还有数量或别的限制条件,这个因体而异. 背包大概分成3部分,下面会细述这最经典的3种题型 ...

  2. 1.4-动态路由协议OSPF③

    OSPF的路由汇总 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                         用默认的网络地址 因为 无论在何种路 ...

  3. HDU 1248寒冰王座-全然背包或记忆化搜索

    寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. [JavaEE] Injecting Bean

    So what is a Bean, in JavaEE, any class expect Entity are Bean. One usefully thing in Bean is Depend ...

  5. [Vue-rx] Watch Vue.js v-models as Observable with $watchAsObservable and RxJS

    You most likely already have data or properties in your template which are controlled by third-party ...

  6. oracle约束总结(not null/unique/primary key/foreign key/check)

    约束(constraint):对创建的表的列属性.字段进行的限制. 诸如:not null/unique/primary key/foreign key/check 作用范围:         ①列级 ...

  7. [WebGL入门]十二,模型数据和顶点属性

    注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外.鄙人webgl研究还不够深入,一些专业词语.假设翻译有误.欢迎大家指 ...

  8. POJ_1679_The Unique MST(次小生成树模板)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23942   Accepted: 8492 D ...

  9. Codeforces Round #319 (Div. 1)C. Points on Plane 分块思想

                                                                              C. Points on Plane On a pl ...

  10. Codeforces Round #273 (Div. 2) B . Random Teams 贪心

    B. Random Teams   n participants of the competition were split into m teams in some manner so that e ...