http://blog.csdn.net/zww0815/article/details/7592940

  1. #include <IOSTREAM>
  2. //#include <WINSOCK.H>
  3. using namespace std;
  4. typedef unsigned short int uint16;
  5. typedef unsigned long int uint32;
  6. // 短整型大小端互换
  7. #define BigLittleSwap16(A)  ((((uint16)(A) & 0xff00) >> 8) | \
  8. (((uint16)(A) & 0x00ff) << 8))
  9. // 长整型大小端互换
  10. #define BigLittleSwap32(A)  ((((uint32)(A) & 0xff000000) >> 24) | \
  11. (((uint32)(A) & 0x00ff0000) >> 8) | \
  12. (((uint32)(A) & 0x0000ff00) << 8) | \
  13. (((uint32)(A) & 0x000000ff) << 24))
  14. // 本机大端返回1,小端返回0
  15. int checkCPUendian()
  16. {
  17. union{
  18. unsigned long int i;
  19. unsigned char s[4];
  20. }c;
  21. c.i = 0x12345678;
  22. return (0x12 == c.s[0]);
  23. }
  24. // 模拟htonl函数,本机字节序转网络字节序
  25. unsigned long int t_htonl(unsigned long int h)
  26. {
  27. // 若本机为大端,与网络字节序同,直接返回
  28. // 若本机为小端,转换成大端再返回
  29. return checkCPUendian() ? h : BigLittleSwap32(h);
  30. }
  31. // 模拟ntohl函数,网络字节序转本机字节序
  32. unsigned long int t_ntohl(unsigned long int n)
  33. {
  34. // 若本机为大端,与网络字节序同,直接返回
  35. // 若本机为小端,网络数据转换成小端再返回
  36. return checkCPUendian() ? n : BigLittleSwap32(n);
  37. }
  38. // 模拟htons函数,本机字节序转网络字节序
  39. unsigned short int t_htons(unsigned short int h)
  40. {
  41. // 若本机为大端,与网络字节序同,直接返回
  42. // 若本机为小端,转换成大端再返回
  43. return checkCPUendian() ? h : BigLittleSwap16(h);
  44. }
  45. // 模拟ntohs函数,网络字节序转本机字节序
  46. unsigned short int t_ntohs(unsigned short int n)
  47. {
  48. // 若本机为大端,与网络字节序同,直接返回
  49. // 若本机为小端,网络数据转换成小端再返回
  50. return checkCPUendian() ? n : BigLittleSwap16(n);
  51. }
  52. //8个二进制(2个十六进制)数转换成十进制数,不含a-f。即00-99的转换
  53. int transfer_0(int x)
  54. {
  55. int y;//结果
  56. int temp;//临时值
  57. y=x%10;//个位数
  58. temp=(x%100-y)/10;//十位数
  59. y+=temp*16;
  60. return y;
  61. }
  62. //32个二进制(4个十六进制)数转换成十进制数,不含a-f。即0000-9999的转换
  63. void transfer_1(unsigned int x)
  64. {
  65. //从右向左
  66. int temp1=x%100;
  67. int y1=transfer_0(temp1);
  68. int temp2=(x%10000-temp1)/100;
  69. int y2=transfer_0(temp2);
  70. int temp3=(x%1000000-temp1-temp2*100)/10000;
  71. int y3=transfer_0(temp3);
  72. int temp4=(x%100000000-temp1-temp2*100-temp3*10000)/1000000;
  73. int y4=transfer_0(temp4);
  74. printf("结果是:%d.%d.%d.%d\n",y4,y3,y2,y1);
  75. }
  76. //将16进制数数转化成10进制数,一位的0-F。
  77. int transfer_0(char x)
  78. {
  79. int y=0;//返回值
  80. if (x>='0' && x<='9')//0-9的数字
  81. {
  82. y=x-'0';
  83. return y;
  84. }
  85. if (x>='a' && x<='f')//a-f的字母
  86. {
  87. y=x-'a'+10;
  88. return y;
  89. }
  90. if (x>='A' && x<='F')//A-F的字母
  91. {
  92. y=x-'A'+10;
  93. return y;
  94. }
  95. printf("参数错误!");
  96. exit(1);
  97. }
  98. //将16进制数数转化成10进制数,八位的00000000-FFFFFFFF。
  99. void transfer_3(char x[],int n)//长度为8
  100. {
  101. //从左往右
  102. int y0=transfer_0(x[0]);
  103. int y1=transfer_0(x[1]);
  104. int y2=transfer_0(x[2]);
  105. int y3=transfer_0(x[3]);
  106. int y4=transfer_0(x[4]);
  107. int y5=transfer_0(x[5]);
  108. int y6=transfer_0(x[6]);
  109. int y7=transfer_0(x[7]);
  110. printf("结果是:%d.%d.%d.%d\n",y0*16+y1,y2*16+y3,y4*16+y5,y6*16+y7);
  111. }
  112. //将16进制数数转化成10进制数,八位的00000000-FFFFFFFF。
  113. void transfer_4(char x[])
  114. {
  115. //从左往右
  116. int y1=transfer_0(x[0])*16+transfer_0(x[1]);
  117. int y2=transfer_0(x[2])*16+transfer_0(x[3]);
  118. int y3=transfer_0(x[4])*16+transfer_0(x[5]);
  119. int y4=transfer_0(x[6])*16+transfer_0(x[7]);
  120. printf("结果是:%d.%d.%d.%d\n",y1,y2,y3,y4);
  121. }
  122. int main()
  123. {
  124. int ret;
  125. ret = checkCPUendian();
  126. if (ret == 1)
  127. {
  128. printf("返回1,本机为大端\n");
  129. }
  130. else
  131. {
  132. printf("返回0,本机为小端\n");
  133. }
  134. return 0;
  135. }

-------------------------------

htonl(),htons(),ntohl(),ntons()--大小端模式转换函数

不同机器内部对变量的字节存储顺序不同,有的采用大端模式(big-endian),有的采用小端模式(little-endian)。
大端模式是指高字节数据存放在低地址处,低字节数据放在高地址处。
小端模式是指低字节数据存放在低地址处,高字节数据放在高地址处。

在网络上传输数据时,由于数据传输的两端可能对应不同的硬件平台,采用的存储字节顺序也可能不一致,因此 TCP/IP 协议规定了在网络上必须采用网络字节顺序(也就是大端模式) 。
通过对大小端的存储原理分析可发现,对于 char 型数据,由于其只占一个字节,所以不存在这个问题,这也是一般情况下把数据缓冲区定义成 char 类型 的原因之一。对于 IP 地址、端口号等非 char 型数据,必须在数据发送到网络上之前将其转换成大端模式,在接收到数据之后再将其转换成符合接收端主机的存储模式。

Linux 系统为大小端模式的转换提供了 4 个函数,输入 man byteorder 命令可得函数原型:

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

htonl 表示 host to network long ,用于将主机 unsigned int 型数据转换成网络字节顺序;
htons 表示 host to network short ,用于将主机 unsigned short 型数据转换成网络字节顺序;
ntohl、ntohs 的功能分别与 htonl、htons 相反。

转载于:https://www.cnblogs.com/kungfupanda/archive/2013/05/03/3056505.html

IP地址转换、主机大小端、htonl、ntohl实现相关推荐

  1. 网络字节顺序和主机字节顺序的转换(htons ntohs htonl ntohl)

    from  https://blog.csdn.net/baidu_33621692/article/details/53213002 网络字节顺序和主机字节顺序的转换(htons ntohs hto ...

  2. 1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

     1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端 ...

  3. 【Linux网络编程学习】预备知识(网络字节序、IP地址转换函数、sockaddr数据结构)

    此为牛客Linux C++课程和黑马Linux系统编程笔记. 1. 网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分. 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小 ...

  4. linux的基础知识——网络字节序转化,ip地址转换函数,sockaddr数据结构

    1.网络字节序 TCP/IP协议规定,网络数据流采用大端字节序,即低地址高字节.为了使网络程序具有可移植性,使得同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机 ...

  5. python整数与IP地址转换

    我们有时会将一个整数与IP地址进行互换,用python代码实现很简单 将一个整数如2000000,变为一个IP地址的方式 >>> import socket >>> ...

  6. 第22节 NAT——实现公私有IP地址转换

    NAT 1 NAT概述 1.1 IP地址概述 1.2NAT概述 2 NAT分类 2.1 静态NAT 2.2 动态NAT 2.3 PAT 2.4 静态PAT 3 NAT命令 3.1 定义内外网接口 3. ...

  7. python整数与IP地址转换 [转]

    原文地址为: python整数与IP地址转换 [转] 我们有时会将一个整数与IP地址进行互换,用python代码实现很简单 将一个整数如2000000,变为一个IP地址的方式 >>> ...

  8. 防火墙关键技术(包过滤、应用代理、网络ip地址转换)

    目录 数据包过滤 包过滤优点 包过滤缺点 应用代理 应用代理优点 应用代理缺点 网络IP地址转换(NAT) 数据包过滤 网络上的数据都是以包为单位进行传输的,每一个数据包中都会包含一些特定的信息,如数 ...

  9. NAT技术配置(内外网IP地址转换)

    NAT技术配置(内外网IP地址转换) 一. 什么是NAT?     NAT是将IP数据报文头中的IP地址转换成另一个IP地址的过程,主要用于实现内部地址(私有IP地址)访问外部地址(公有IP地址)的功 ...

  10. 利用函数进行ip地址转换

    inet_addr.inet_ntoa.inet_pton.inet_ntop用法 inet_addr(): inet_ntoa(): inet_pton(): inet_ntop(): 运行实例 1 ...

最新文章

  1. 树莓派 ubuntu 安装Python+OpenCV
  2. 构建良好的敏捷团队氛围
  3. hana::detail::variadic::foldr1用法的测试程序
  4. YUV422/420 format
  5. J2CL –迟到总比不到好
  6. tensor判断是否相等_PyTorch的Tensor(中)
  7. kind富文本编辑器_在VueJs中集成UEditor 富文本编辑器
  8. python文件批量重命名以数字~n的方式重命名_利用Python对文件进行批量重命名
  9. lambda方法引用总结——烧脑吃透
  10. Mycat监控_监控平台安装Mycat-web_作为配置中心注册发现用---MyCat分布式数据库集群架构工作笔记0037
  11. python数字图像处理(13):基本形态学滤波
  12. HTML(超文本标记语言)的内容和理解
  13. 远程服务器桌面配置iis6,windows 2003服务器安装 IIS6.0和IIS自带FTP服务器图文教程...
  14. C++ malloc头文件
  15. 中标麒麟linux系统安装打印机_国产操作系统中标麒麟系统安装教程
  16. SEM 与 SEO 之间的区别与联系
  17. 对视图有时为什么使用select top 100 percent * 而不使用 select * 呢?
  18. 计算机考试照片是一寸,怎么用电脑拍照片_怎么用电脑将照片修成一寸大小
  19. 游戏开发之Unity2021智能导航地图烘焙
  20. 程序员常见英文缩写及其意义

热门文章

  1. 计算机毕业设计SSM大学生学习交友平台【附源码数据库】
  2. ChatGPT小技巧:论文降重
  3. 选择马来西亚城市大学的六大理由
  4. CEGUI环境的搭配
  5. python里面pow是什么意思_python中pow是什么意思
  6. 首届中国网络文学论坛
  7. java 运行批处理文件_如何从Java应用程序运行批处理文件?
  8. delphi android 多线程,Delphi实现简单多线程
  9. x3daudio1 7.dll怎么修复?修复方法推荐
  10. 软件设计的哲学:第十一章 两次设计