我知道以编程方式测试字节序的最常用方法是像这样转换为char *:
short temp = 0x1234;
char* tempChar = (char*)&temp;
但是可以通过像这样强制转换来做到这一点:
unsigned char test[2] = {1,0};
if ( *(short *)test == 1)
//Little-Endian
else
//Big-Endian
我是否正确使用Little-Endian约定将“测试”缓冲区保存在内存中(在x86平台上)(从右到左:低位为“0”,高位为“1”)比如“temp”var?
更常见的是,如果我有一个字符串: char tab [] =“abcdef”; 它将如何存储在内存中?会不会像“fedcba”那样反转?
THX。提前: - )
PS。
有没有办法查看程序数据在系统内存中的确切外观? 我想在“现实生活”中看到Little-Endian中的字节交换。
答案 0 :(得分:2)
您的代码可能在实践中有效(您可能刚试过它!)。但是,从技术上讲,它会调用未定义的行为;标准不允许您通过另一种类型的指针访问char数组。
更常见的是,如果我有一个字符串:char tab [] =“abcdef”;它将如何存储在内存中?会不会像“fedcba”那样反转?
没有。否则tab[0]
将为您提供f
。
答案 1 :(得分:0)
检查字节顺序的替代方法可行。
char tab[] = "abcdef"
将以相同的顺序存储:abcdef
当您访问多个字节(short,int等)时,Endianness会起作用。当你尝试使用一个小端机器访问tab[]
作为一个短阵列时,你会把它读作ba,dc,fe(无论它们的实际字节当量是多少,这就是字符“被评估”的顺序)简短的。)
答案 2 :(得分:0)
两种方式都不能保证工作,而且后者会调用未定义的行为。
如果sizeof(char) == sizeof(short)
首先失败。
第二个可能由于同样的原因而失败,并且也是不安全的:指针转换的结果可能有错误的对齐,而访问(short)值会调用未定义的行为(3.10.15)。
但是,是的,char缓冲区按顺序存储到内存中,以便&test[0] < &test[1]
,
更一般地说,正如其他人已经说过的那样,char tab[] = "abcdef"
不会被颠倒或以其他方式加入,无论字节顺序如何。
答案 3 :(得分:0)
使用联盟会更安全,即符合标准。