在char混乱中逃脱序列

时间:2016-01-19 09:18:46

标签: c++ escaping endianness

我遇到了这个例子here

#include <iostream>

int main()
{
    int i = 7;

    char* p = reinterpret_cast<char*>(&i);
    if(p[0] == '\x7') //POINT OF INTEREST
        std::cout << "This system is little-endian\n";
    else
        std::cout << "This system is big-endian\n";
}

我很困惑的是if语句。转义序列如何在这里表现?我得到了与p[0] == '\07'相同的结果(\x是十六进制转义序列)。如何检查p[0] == '\x7'是否告诉我系统是小端还是大端?

3 个答案:

答案 0 :(得分:3)

十六进制7和八进制7恰好是相同的值,小数点为7。

该检查旨在确定该值是否以int的第一个或最后一个字节结束。

一个小端系统会将值的字节存储在&#34;反向&#34;订单,首先是下半部分

07 00 00 00

大端系统将存储&#34;大&#34;先结束

00 00 00 07

通过读取第一个字节,代码将查看7是否在那里结束。

答案 1 :(得分:3)

内存中(32位)整数的布局是;

Big endian:

+-----+-----+-----+-----+
|  0  |  0  |  0  |  7  |
+-----+-----+-----+-----+
   ^ pointer to int points here

Little endian:

+-----+-----+-----+-----+
|  7  |  0  |  0  |  0  |
+-----+-----+-----+-----+
   ^ pointer to int points here

代码基本上是读取整数指针指向的第一个 char ,在小端的情况下是\x0,大端是\x7

答案 2 :(得分:1)

十进制中的7与十六进制中的7和八进制中的7相同,因此如果您使用'\x7''\07',甚至只是7,则无关紧要(数字文字,而不是字符)。

对于字节序测试:i的值为7,意味着它在最低有效字节中的数字为7,在所有其他字节中为0。强制转换char* p = reinterpret_cast<char*>(&i);使p指向i表示中的第一个字节。然后测试检查该字节的值是否为7.如果是,则它是最不重要的字节,暗示一个小端系统。如果该值不是7,则它不是小端系统。该代码假设它是一个大端,虽然它没有严格建立(我相信有一些具有某种混合字节序的异域系统,尽管代码可能不会在实践中运行)