TCPIP网络编程-学习总结(1)
来源:互联网 发布:mac系统显示隐藏文件 编辑:程序博客网 时间:2024/06/13 01:19
1.htons htonl ntohs ntonl
网络字节顺序与本地字节顺序之间的转换
h to n : host to network
n to h : network to host
s : short
l : long
主机字节顺序跟芯片有关,如Intel就是低位在前,高位在后
网络字节顺序跟芯片无关,高位在前,低位在后
一、字节序定义
字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。
其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。
在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和Little-Endian。引用标准的Big-Endian和Little-Endian的定义如下:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
其实我在第一次看到这个定义时就很糊涂,看了几个例子后也很是朦胧。什么高/低地址端?又什么高低位?翻阅了一些资料后略有心得。
二、高/低地址与高低字节
首先我们要知道我们C程序映像中内存的空间布局情况:在《C专家编程》中或者《Unix环境高级编程》中有关于内存空间布局情况的说明,大致如下图:
----------------------- 最高内存地址 0xffffffff
| 栈底
.
. 栈
.
栈顶
-----------------------
|
|
/|/
NULL (空洞)
/|/
|
|
-----------------------
堆
-----------------------
未初始化的数据
----------------(统称数据段)
初始化的数据
-----------------------
正文段(代码段)
----------------------- 最低内存地址 0x00000000
以上图为例如果我们在栈上分配一个unsigned char buf[4],那么这个数组变量在栈上是如何布局的呢[注1]?看下图:
栈底 (高地址)
----------
buf[3]
buf[2]
buf[1]
buf[0]
----------
栈顶 (低地址)
现在我们弄清了高低地址,接着我来弄清高/低字节,如果我们有一个32位无符号整型0x12345678(呵呵,恰好是把上面的那4个字节buf看 成一个整型),那么高位是什么,低位又是什么呢?其实很简单。在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。
高低地址和高低字节都弄清了。我们再来回顾一下Big-Endian和Little-Endian的定义,并用图示说明两种字节序:
以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:
Big-Endian: 低地址存放高位,如下图:
栈底 (高地址)
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
栈顶 (低地址)
Little-Endian: 低地址存放低位,如下图:
栈底 (高地址)
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
---------------
栈顶 (低地址)
在现有的平台上Intel的X86采用的是Little-Endian,而像Sun的SPARC采用的就是Big-Endian。
- TCPIP网络编程-学习总结(1)
- java 网络编程(二)TCPIP+BIO
- TCPIP之四书五经---学习Linux网络编程经典推荐
- 【TCPIP】Unix下网络编程
- Linux 网络编程 tcpip基础
- Boost::thread 用法(网络socket引用)TCPIP编程
- 网络编程学习总结
- 网络编程学习总结
- Sundy视频学习------TCPIP编程基础
- TCPIP编程
- 网络编程(25)—— 详解TCPIP断开连接后的Time-wait状态
- 今日网络编程学习总结
- Linux网络编程学习总结
- socket网络编程学习总结
- 电子科大杨宁TCPIP协议原理(总结)
- 网络编程总结 1
- tcpip详解学习笔记1_基本概念
- 如何学习TCPIP(基于51单片机)
- 快速排序List的通用方法
- JavaScript 经典代码大全
- 用向量空间引擎搜索结构化 LDAP 数据
- Rational Edge: 在降低风险的情况下更快地交付系统:RUP 的宏观迭代维度
- 提高 Web Service 数据传输效率的基本方法
- TCPIP网络编程-学习总结(1)
- 设计实现可重用的 SWT 构件
- 构建成功的 SOA 项目
- 欢迎加入《LoadRunner性能测试实战》“以书会友”群
- MultiByteToWideChar和WideCharToMultiByte用法详解
- 利用 Project Zero 和 REST 设计原理创建相册应用程序
- DMapler快捷键
- 为 IBM Lotus Notes V8 构建复合应用程序
- beanshell的源码实现