在上一篇文章网络编程:主机字节序和网络字节序中,介绍了主机字节序和网络字节序的基本概念以及在实际的编程中,何时需要进行网络字节序和主机字节序的转换。本篇文章着重介绍使用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. 察看linux 发行版

    好像没有太通用的方法. 看一下/etc/redhat-release.  redhat 系列(包括centos) 会有如下内容 [root@localhost ~]# cat /etc/redhat- ...

  2. [Vue @Component] Dynamic Vue.js Components with the component element

    You can dynamically switch between components in a template by using the reserved <component>  ...

  3. 从头认识java-15.1 填充容器(1)-利用Collection构造器的方式

    这一章节我们来介绍一下填充容器. 就像数组一样,Arrays.fill是填充方法,在容器里面也有. 1.Collections.nCopies 这种方法是生成某种类型多少个对象,然后我们能够把他放到容 ...

  4. 【Cocos2dx游戏开发】Cocos2d-x简介

    一.简介 最近在做一个Android下的卡牌游戏--<九州幻想>开发项目,而我们使用的引擎是Cocos2dx,所以想要写写笔记来记录一下项目中的收获.当然首先稍微介绍一下Cocos2d-x ...

  5. 读写Word的组件DocX介绍与入门

    本文为转载内容: 文章原地址:http://www.cnblogs.com/asxinyu/archive/2013/02/22/2921861.html 开源Word读写组件DocX介绍与入门 阅读 ...

  6. linux下的epoll怎样高效处理百万连接

    开发高性能网络程序时.windows开发人员们言必称iocp,linux开发人员们则言必称epoll.大家都明确epoll是一种IO多路复用技术,能够很高效的处理数以百万计的socket句柄,比起曾经 ...

  7. 金典 SQL笔记 SQL语句汇总

    SELECT * FROM (SELECT ROW_NUMBER() OVER ( ORDER BY id) AS rowN,FNumber, FName,FSalary ,Fage FROM dbo ...

  8. luogu3959 宝藏 搜索+剪枝

    题目大意 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但是 ...

  9. Excel 常用快捷键键 快捷方式

    移动整行的位置 Shift + Alt + 鼠标拖拽 不加Shit + Alt 移动后 留白 注意:需要移动鼠标到行的最上面,变成十字箭头

  10. geronimo

    时间限制 1s 空间限制 512MB 3.1 题目描述 "Geronimo∼" 时间还很多,让我们慢慢来. 不如听首开心的歌再看题?-- 算了,直接看题吧. 给定一个整数 n,以及 ...