免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4585 | 回复: 7
打印 上一主题 下一主题

有关字节序的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-07-25 23:42 |只看该作者 |倒序浏览
对于不同软件和硬件之间的差异,在技术人员看来除了叹息,不会有更多的情绪

,这样的现象是多种原因造成的,可是对于人为的差异,我总是痛恨不已,字节

序就是这样一个列子。
简单的说,字节序就是在处理数字时,机器和实际数字高低位顺序,也就

是:
数字:0x10 00 20  
little-endian机器:20 00 10
big-endian   机器:10 00 20
这样的差异是由 CPU 决定的,当前流行的 cpu 据我所知IBM的power-pc
是 big-endian  的,其他基本是 little-endian 的。
这样的差别导致在异种平台交换数据时可能发生问题,当然在异种平台间交换数据是

一个敏感的问题,有很多方法可用,这里不讨论。不过在编程时,也会有这样的

问题,看一下这种情况:
  1. *((short*)"AB") >;>; 8
复制代码
结果:
  1. little-endian = 'B'
  2.    big-endian = 'A'
复制代码
这个语句可以用来判断机器字节序.
如果在字节序不同的平台间的交换数据必须进行转换,比如对于 int 类型:
big-endian 写入文件
  1. int i = 100;
  2. write( fd, &i, sizeof(int) );
复制代码
little-endian 读出后
  1. int i;
  2. read( fd, &i, sizeof(int) );
  3. char buf[sizeof(int)];
  4. memcpy( buf, &i, sizeof(int) );
  5. for( i = 0; i < sizeof(int); i ++ )
  6. {
  7.         int v;
  8.         v = buf[sizeof(int) - i - 1];
  9.         buf[sizeof(int) - 1] =  buf[i];
  10.         buf[i] = v;
  11. }
  12. memcpy( &i, buf, sizeof(int) );
复制代码
这仅仅是个列子,在异钟平台间直接传递二进制数据,即使不存在字节序的问题,也不是一个明智的方法,作

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

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

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

这样很不方便,如果使用前面的语句来判断,就可以自动适应了。

论坛徽章:
0
2 [报告]
发表于 2003-07-26 08:45 |只看该作者

有关字节序的问题

字节序的问题影响的不仅仅是异种平台传递数据,还影响例如写一些特殊格式文件这类程序的可移植性。此时我觉得使用预编译的方式来完成就是一个
好办法。
从字节序的问题不妨引申到类型长度部移植问题。
我觉得以上应该都是关于编写异种平台程序应该注意的问题

论坛徽章:
0
3 [报告]
发表于 2003-07-26 09:52 |只看该作者

有关字节序的问题

字节和类型长度的话开发时确实要想

在linux内核中使用的就是自己重定义一套新变量 使用typedef

如 u32_t  这就是32位长度的unsigned

字节和类型长度的话要制定网络接口时要考虑 所以一般接口文档中都说明几个字节长度 每个类型是什么保存的如BSD 还是二进制等

论坛徽章:
0
4 [报告]
发表于 2003-07-28 21:58 |只看该作者

有关字节序的问题

我记得永远的unix的论坛有一个10种不同平台下的c的问题的帖子
说得不错

论坛徽章:
0
5 [报告]
发表于 2011-02-20 11:58 |只看该作者
楼主你好, *((short *)"AB") >> 8 这个表达式能不能正确判断字节序,得依赖编译器实现;
在不同的编译器编译得出的结果会不尽相同,例如在DEV-CPP4.9.9.2中得出A,在VS2008中得出B,
在判断字节序的时候采用指针就不会出现这种问题

论坛徽章:
0
6 [报告]
发表于 2011-02-20 15:35 |只看该作者
从程序角度看,大部分字节序该是汇编器(或者c的二进制产生的模块)说了算吧,用的是产生大端代码的编译器,那产生的不就是大端的了,数据流跨体系传输或读写是不是可以借用socket的转换函数,不太清楚,希望前辈们多讨论好方法。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
7 [报告]
发表于 2011-02-20 19:59 |只看该作者
本帖最后由 yulihua49 于 2011-02-20 20:01 编辑
从程序角度看,大部分字节序该是汇编器(或者c的二进制产生的模块)说了算吧,用的是产生大端代码的编译器, ...
dzmcs 发表于 2011-02-20 15:35



    主要是CPU硬件的指令系统决定的、数据总线到寄存器连线的次序。
如果编译器产生的次序不同于硬件的次序,那么运行时还要翻译代码。

论坛徽章:
0
8 [报告]
发表于 2011-02-20 22:46 |只看该作者
8年前的帖子,真牛B,这都找出来了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP