以编程方式检查字节顺序

时间:2012-06-25 21:14:23

标签: c++ memory-management endianness

我知道以编程方式测试字节序的最常用方法是像这样转换为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中的字节交换。

4 个答案:

答案 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)

使用联盟会更安全,即符合标准。