Chinaunix首页 | 论坛 | 博客
  • 博客访问: 743903
  • 博文数量: 769
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 4985
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 16:37
文章分类

全部博文(769)

文章存档

2011年(1)

2008年(768)

我的朋友

分类:

2008-10-15 16:40:32

      最近接触到网络字节序的概念 查了查资料 不是很明白 先引用一段材料:

    字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。基于X86平台的PC机是小端字节序的,而有的平台则是大端字节序的。因而对int、uint16、uint32等多于1字节类型的数据,在这些平台上应该变换其顺序。通常我们认为,在空中传输的字节的顺序即网络字节序为标准顺序,考虑到与的一致以及与同类其它平台产品的互通,在程序中发数据包时,将主机字节序转换为网络字节序,收数据包处将网络字节序转换为主机字节序。

    在本Linux的书里介绍到INTEL的CPU使用的小端字节序 其他比MOTOROLA
    68000系列CPU使用的是大端字节序 如果不转换 将数据通过网络发出时 比如MOTOROLA发一个16位数据:0X1234 传送到INTEL时
    就被INTEL解释为0X3412 也就是4660成了13330 所以有时候需要一些函数来进行大小端字节序的转换

    关于这大小字节序的概念不是很想的明白 数据在
    内存里是具体怎么存放的形式?为什么会有CPU解释的不同?数据不是按12345678……这样的顺序一直排列的么?希望大人赐教 谢谢

    不就是大小印地安记法吗
    1)从低到高存 (liittle edian)
    例:0x1234
    内存中是0x34 0x12
    2)从高到低存 (big edian)
    例:0x1234
    内存中是0x12 0x34

    如: 一个多字节值 0xFECDBA98,内存从地址100开始存放

    降序: FE CD BA 98---->对应地址100 101 102 103

    升序: 98 BA CD FE ---->same above

    注意,我们的书写表示法是从低字节位--->高字节位


    至于为什么CPU解释不同,可能是由于不同的体系构架在起始竞争时人为地制造

    和对手不兼容性......害的我们这么惨,一遇到移植就要注意这个

    C代码的移植相对简单原因之一就是由于C的连续数据永远保持从低地址到高

    地址的索引........

    小端字节序就是升序排列那种?
    我们的书写表示法是从低字节位--->高字节位 这个是什么意思呢?难道FECDBA98是从低到高(从左到右)吗?

    还有它排列是按单个字节来 还是按数据类型的?比如说是INT型就按两个两个排 就象0X1234 和0X3412 而不是0X1234 和0X4321?

    我们的书写表示法是从低字节位--->高字节位 这个是什么意思呢?难道FECDBA98是从低到高(从左到右)吗?"

    否


    "还有它排列是按单个字节来 还是按数据类型的"

    对于多字节数据才有这么一出

    这样理解吧
    譬如:
    内存地址生长方向为: 从左到右 由低到高(这是不变的)

    数据为: 0x89ABCDEF

    降序(Big-endian)大端字节序 存储时 由左到右

    升序(Little-endian)小端字节序 存储时 由右向左

    可以自己编一个小程序验证一下(用C的数组)

    更简单的调用VC里的checkEndian()

【责编:landy】

--------------------next---------------------

阅读(447) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~