几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » 程序设计 » vc编程
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


回复
 
主题工具 搜索本主题 显示模式
旧 2007-05-10, 03:33 PM   #1
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 字节序是什么意思

有关字节序的问题
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]这仅仅是个列子,在异钟平台间直接传递二进制数据,即使不存在字节序的问题,也不是一个明智的方法,作

为可选的方式就是使用文本来交换数据,这样至少可以避免字节序的问题。

很多的加密算法为了追求速度,都会采取字符串和数字之间的转换,在计算完毕

后,必须注意字节序的问题,在某些实现中可以见到使用预编译的方式来完成,

这样很不方便,如果使用前面的语句来判断,就可以自动适应了。
yogy离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
旧 2007-05-10, 03:34 PM   #2
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 回复: 字节序是什么意思

大端小端针对多字节数据存储时字节顺序而言的

所谓"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
yogy离线中   回复时引用此帖
旧 2007-05-10, 03:35 PM   #3
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 回复: 字节序是什么意思

想想看,当年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的字节序就这么定下来了
yogy离线中   回复时引用此帖
回复


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 01:41 PM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多