![]() |
字节序是什么意思
有关字节序的问题
http://www.douzhe.com 作者:jobman 发表于:2003-07-25 23:42:46 对于不同软件和硬件之间的差异,在技术人员看来除了叹息,不会有更多的情绪 ,这样的现象是多种原因造成的,可是对于人为的差异,我总是痛恨不已,字节 序就是这样一个列子。 简单的说,字节序就是在处理数字时,机器和实际数字高低位顺序,也就 是: 数字:0x10 00 20 little-endian机器:20 00 10 big-endian 机器:10 00 20 这样的差异是由 CPU 决定的,当前流行的 cpu 据我所知IBM的power-pc 是 big-endian 的,其他基本是 little-endian 的。 这样的差别导致在异种平台交换数据时可能发生问题,当然在异种平台间交换数据是 一个敏感的问题,有很多方法可用,这里不讨论。不过在编程时,也会有这样的 问题,看一下这种情况: [code:1:8c0a01ddec]*((short*)"AB") >> 8 [/code:1:8c0a01ddec]结果: [code:1:8c0a01ddec]little-endian = 'B' big-endian = 'A'[/code:1:8c0a01ddec]这个语句可以用来判断机器字节序. 如果在字节序不同的平台间的交换数据必须进行转换,比如对于 int 类型: big-endian 写入文件 [code:1:8c0a01ddec]int i = 100; write( fd, &i, sizeof(int) );[/code:1:8c0a01ddec]little-endian 读出后 [code:1:8c0a01ddec]int i; read( fd, &i, sizeof(int) ); char buf[sizeof(int)]; memcpy( buf, &i, sizeof(int) ); for( i = 0; i < sizeof(int); i ++ ) { int v; v = buf[sizeof(int) - i - 1]; buf[sizeof(int) - 1] = buf[i]; buf[i] = v; } memcpy( &i, buf, sizeof(int) );[/code:1:8c0a01ddec]这仅仅是个列子,在异钟平台间直接传递二进制数据,即使不存在字节序的问题,也不是一个明智的方法,作 为可选的方式就是使用文本来交换数据,这样至少可以避免字节序的问题。 很多的加密算法为了追求速度,都会采取字符串和数字之间的转换,在计算完毕 后,必须注意字节序的问题,在某些实现中可以见到使用预编译的方式来完成, 这样很不方便,如果使用前面的语句来判断,就可以自动适应了。 |
回复: 字节序是什么意思
大端小端针对多字节数据存储时字节顺序而言的
所谓"Little Endian",为INTEL所采用模式,数据的低字节存放在内存低地址中,高字节存放在高地址中,即学X86时说的“高高低低”原则。Byte3 Byte2 Byte1 Byte0在内存中对应的是: Base Address+0 Byte0 Base Address+1 Byte1 Base Address+2 Byte2 Base Address+3 Byte3 所谓"Big Endian" ,为MOTO所采用模式,数据的低字节存放在内存的高地址,数据的高字节存放在内存的低地址。Byte3 Byte2 Byte1 Byte0在内存中对应的是: Base Address+0 Byte3 Base Address+1 Byte2 Base Address+2 Byte1 Base Address+3 Byte0 |
回复: 字节序是什么意思
想想看,当年intel的cpu还是8088的时候,处理字长是16bits是很先进的cpu了,并没有多少基于它的专有软件。他考虑了低位在前高位在后的字节序是为了跟更早的8位计算兼容,那年月很多软件用汇编写的。
这样当汇编代码是 mov al,byte ptr [1234h] adc cl,al 的代码就可以很自然地升级为 mov ax,word ptr [1234h] adc cx,dx 因为在做了操作字对齐以后原来代码中数据段的1234这个地址的数据高位为0,保留了兼容。 还有一些基于栈跳转的技巧更是byte必争。所以intel的字节序就这么定下来了 |
所有的时间均为北京时间。 现在的时间是 08:06 AM. |