首页
社区
课程
招聘
[旧帖] [原创]字节序的问题 0.00雪花
发表于: 2009-4-15 20:38 13070
申请推荐此帖 编辑 删除

[旧帖] [原创]字节序的问题 0.00雪花

2009-4-15 20:38
13070

大端、小端:
    大小端是指CPU存储数据的方式,比如一个0x01020304这个整数,在WIN、Linux下在内存中的布局如下
   [01][02][03][04] 注意左边是高地址,而右边是低地址
   在UNIX下则是
   [04][03][02][01] 注意左边是高地址,而右边是低地址

   通俗的说,和WIN下的内存布局一致的就是小端,和UNIX下一致的就是大端。
   其实在以前还出现过中端的的机型,不过这些机型也太“孤僻”了,已经落伍没人生产没人用了。

网络字节序:
   其实是指网络传输的字节序,这个字节序可能是大端序或者小端序,这取决于软件开始时通讯双方的协议规定。
   平时,如果有人说的网络字节序,那么大家就认为是大端序。

主机字节序:
   是指主机处理数据时采用的字节序,虽然主机字节序和网络字节序是相对的概念,但是我们说主机字节序的时候,并不默认是之大端或者小端,而是结合机型来确定大小端的。

位序:
   我们通常所说的字节序是指字节之间的关系,但是即使是一个字节中的某一位(bit)也是有排序的问题的。位序也有大端序,小端序,中端序,也还有其他的乱七八糟的位序的,但是都不常见。
   开发的时候,我们是不用关心位序,编译器和CPU会自己处理这些事情。

算术运算与内存操作运算:
   算术运算是不改变被运算数据的字节序的,此时我们不用关心所操作的数据到底是什么字节序的。但是内存操作运算就要注意了,比若我们将一个整数指针强制转换为一个字符指针类型,然后对字符指针类型的四个字节进行算数运算,此时我们必须知道是什么字节序。不然写出的代码要么是错误的,要么移植到其他机器的时候就不能正常运行。
   常见的算术有+ - * / % & | ~ << >> = 等,请注意& | ~ << >> 这几个是算术运算而不是内存操作运算,所以他们进行混合运算的时候不用关心字节序或者位序问题。赋值运算符仅在数据类型兼容的时候才不涉及字节序问题,才能算作算术运算。
   常见的内存操作运算有:强制转换后对碎片数据的算术运算,内存copy/write,读写文件等。

浮点数的字节序:
   浮点数......我也不知道应该怎么处理其字节序问题,网上也查了很久但是没有很权威的答案。对于浮点数,我建议不要直接传内存值,按照字符串传输即可。

IP地址的字节序:
  记住一条,IP地址的整数值,自IP地址生成的时刻起,就一定是网络字节序的,所以我们在转字节序的时候,IP 地址我们往往跳过对IP地址的字节序转换。呵呵,IP地址已经是网络字节序了,所以我们仅需要做算术赋值操作即可。

字节序转换函数:
   OS一般都提供htons、htonl、ntohs、ntohl这四个字节序操作函数,这些函数的目的虽然相同,而且操作后内存布局也相同,但是从算术运算的角度来看这些函数的特性是与机型相关的:在WIN下这四个函数会改变所操作的数的数值,但是在UNIX下就不回改变数据的算术值,UNIX下这些函数是空操作。这个差别也可能是为什么UNIX服务器上程序的性能会高于WIN的一个小原因。

不好意思,刚才领悟错了申请的意思,所以重新写了个.
申请人QQ:363459××
EMAIL: macky_juzix××g@126.com


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (50)
雪    币: 5198
活跃值: (1138)
能力值: (RANK:30 )
在线值:
发帖
回帖
粉丝
2
申请己通过,邀请码己发
2009-4-17 09:53
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习~~~~~~~~~~支持!!!!!!!
2009-5-6 15:35
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
真是有点好耶,谢谢。
2009-5-7 11:57
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这就算是原创的?
2009-5-12 21:42
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
抄一段书也可以吗?
2009-5-12 21:43
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习~~~~~~~~~~支持!!!!!!!
2010-8-28 00:37
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
看看  有帮助
2010-8-30 21:13
0
雪    币: 198
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
顺序老弄反了... 还是不太熟悉他.
2010-8-31 17:06
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
好帖。。。学习了。。。谢谢楼主
2010-9-3 23:14
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
可能是底下东东了解不多,我用的是WINDOWS的,CPU字节的了解不多的吧,觉得很新鲜
2010-9-11 09:22
0
雪    币: 163
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
看不懂
还是淡然飘过吧~~
2010-9-11 10:32
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
看不懂,需要学习
2010-9-15 13:54
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
字节序跟cpu架构有关吧,怎么跟操作系统有关了呢
2010-9-17 11:05
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习好文章,多谢
2010-9-17 11:10
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
在WIN、Linux下在内存中的布局如下
   [01][02][03][04] 注意左边是高地址,而右边是低地址
   在UNIX下则是
   [04][03][02][01] 注意左边是高地址,而右边是低地址

??
2010-9-23 19:56
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
同14楼的观点,字节序应该和CPU体系相关和OS没有关系,楼主得出windows和linux字节序不同的结论,应该是碰巧你的linux测试机和windows测试机CPU体系结构不一样导致的。
2010-10-13 09:35
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
引一下 Wiki 说明,都是跟CPU架构关系吧
http://zh.wikipedia.org/zh-cn/%E5%AD%97%E8%8A%82%E5%BA%8F
2010-10-13 14:45
0
雪    币: 202
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
对呀,字节充和cpu架构有关。x86小端,arm大小端(可配),龙芯mips小端。
2010-10-13 14:50
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
学习了,谢谢了。
2010-10-13 22:38
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
不知道在说什么
2010-11-2 19:38
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
路过,学习一下!!
2010-11-2 19:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
学习了,感谢看雪
2010-11-4 10:45
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
还是不懂 再看一遍.....
2010-11-4 10:59
0
雪    币: 433
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
学习下。多谢分享。
2010-11-14 14:44
0
游客
登录 | 注册 方可回帖
返回
//