[概念求解] - 字节序问题,高手来解答,新手来学习,欢迎欢迎!!!(300分)

  • 主题发起人 主题发起人 Alucard
  • 开始时间 开始时间
A

Alucard

Unregistered / Unconfirmed
GUEST, unregistred user!
1. TCP/IP的规定都是Big-endian吗?如果我用Little-endian的机器发送Little-endian的数据,然后用Little-endian的机器接受这些数据,会有问题吗?
2. PowerPC是Big-endian?现在的Power PC还是Big-endian?Intel和AMD呢?我听到了两种说法,(1)x86 CPU都是Little-endian。(2)Intel的CPU是Little-endian,AMD的是Big-endian。哪种说法对?
3. 所谓字节序是指字节的顺序还是字节中字位的顺序?下面的例子中,那个是正确的:
例A:
0x12AB 这段十六进制数据(逻辑)
物理存储方式:
big-endian: 12 AB
ltl-endian;
AB 12
例B:
还是0x12AB这段数据(逻辑,转换成二进制:0001 0010 1010 1011)
物理存储方式:
big-endian: 0001 0010 1010 1011
ltl-endian Option 1: 1000 0100 0101 1101 ?
ltl-endian Option 2: 1101 0101 0100 1000 ?
以上A、B两种理解,那种理解正确?
4. 文件存储的时候会有字节序问题吗?也就是说,我在Little-endian的机器上将内存中的一个结构体不加转换的直接写入到一个文件中(二进制),在Big-endian的机器上读取这个文件,能够没有歧义的读出来吗?
5. 字节序问题的历史原因与将来(将来还会存在这个问题吗?)
5个问题,不分难度,平均分,分不够可以提出来我可以再追加(不过我也没多少分了)
 
刚才忘记了,先为遇难同胞默哀,为仍在受难的同胞祝福....
一定要挺住!你们的安危牵动着全国人的心!
捐款就不用动员了,大家肯定是有一分力出一分力,捐过款之后也不要停止对受灾同胞的祝福...
 
3. A正确
其他没听过机器有大尾小尾区别.
 
谢谢总有爱
第三题的答案接受了
期待了解的朋友解答其他问题。。。
 
1.是.会有问题
2.两种都有,(2)
4.应该不能
5.不知道
 
Little-endian的机器发送Little-endian的数据,然后用Little-endian的机器接受这些数据,同样都是Little-endian,将错就错也会有问题?
在发送的时候Socket函数会自动调节字节序?
 
我记得网络字节就是为了这原因,所以,一般标准协议的字段,很大部分是网络字节。
平常我们写程序是没有注意这些东西,但如果写一些标准协议时,就需要用到。
找时间GG下。
 
to Digua
>>1.是.会有问题
这个接受了,不过我向几个人打听了,LE发向LE的机器不加处理不会有问题,不知道你们谁说的对,我更倾向于LE发向LE机器没有问题这一说法,因为我们在用Delphi发送Buffer的时候并没有进行过处理(Little-Endian),接收时(Little-Endian)也没有处理,接收的数据一切正常。
>>2.两种都有,(2)
这个接受了,不过答案仍是有点小问题,PowerPC貌似是既可以大头也可以小头的,好像取决于某个参数;
x86体系的CPU都是小头的,当然包括AMD生产的x86体系的CPU,我的电脑的CPU是AMD Athlon X2的,刚才做了个测试程序也验证了(这个问题我问得很蠢,其实Windows也无法在Big-Endian的机器上运行,之所以这样问是因为当初我以为M$为了兼容BE、LE做了些特殊的处理方式)
>>4.应该不能
这个接受了,确实是不能,如果要保证文件跨平台可用的话就要事先规定好,文件内部的数据是Big-Endian的还是Little-Endian的
>>5.不知道
这个也接受了吧,貌似知道这个也没什么用[:)],不过字节序问题恐怕在我们的有生之年还会一直存在。
一会儿总结一下字节序的概念就放分。
 
明确一下字节序的概念:
字节序问题的粒度是字节,而不是位,也就是说一个值为1的INT16类型的数据(0x0001),在内存中是这样排列的:0x0100,程序中:
/* 例子1 */
INT16 n(1);//声明定义一个INT16类型(INT16占两个字节)的变量n,初始化为1
*(char*)&n;//将n的地址解释为“char指针”再解引用,x86体系的机器上我们得到的值为“1”,也就是证明了x86体系的机器是Little-Endian的
/* 例子2 */
INT16 n(256);//声明一个INT16类型的变量n,初始化为256(十六进制是0x0100)
*(char*)&n;
//将n的地址解释为“char指针”再解引用,x86体系的机器上我们得到的值为“0”,同样证明了x86体系的机器是Little-Endian的
我们接触的“大部分”PC都是Little-Endian,部分嵌入式CPU可能会用Big-Endian
网络传输、串口通讯、文件保存都要注意一下这个问题,当然如果你没有跨平台的打算那就不用费心了。

总有爱:120, DIGUA:150, errorcode:30
分数分配如有不公还望海涵。
 
接受答案了,分数分配如有不公还望海涵(刚才点错了,没成功)。
 
后退
顶部