这个reinterpret_cast如何工作? (将C ++移植到Java)

时间:2010-12-14 12:43:50

标签: java c++ porting reinterpret-cast

我有一些C ++代码我试图移植到Java,看起来像这样:

struct foostruct {
    unsigned char aa : 3;
    bool ab : 1;
    unsigned char ba : 3;
    bool bb : 1;
};

static void foo(const unsigned char* buffer, int length)
{

    const unsigned char *end = buffer + length;

    while (buffer < end)
    {
        const foostruct bar = *(reinterpret_cast<const foostruct*>(buffer++));
        //read some values from struct and act accordingly
    }

}

reinterpret_cast在做什么?

3 个答案:

答案 0 :(得分:4)

它做了经典的C风格(const foostruct *)buffer最坏的事情:告诉C ++忽略所有的安全性,你真的知道自己在做什么。在这种情况下,buffer实际上由foostruct组成,而{{1}} s又是在单个8位字符上覆盖的位字段。从本质上讲,您可以通过获取字节并自行执行shift和掩码操作来在Java中执行相同的操作。

答案 1 :(得分:4)

它基本上说当前指针所代表的8位应该被解释为“foostruct”。

在我看来,写得更好如下:

const unsigned char aa = *buffer & 0x07;
const bool ab          = (*buffer & 0x08) != 0;
const unsigned char ba = (*buffer & 0x70) >> 4;
const bool bb          = (*buffer & 0x80) != 0;

我认为当时所做的更为明显。我想你也可能会发现以这种方式移植到Java更容易......

答案 2 :(得分:2)

你有一个指向unsigned char的指针吗?现在想象一下,指针指向的位被视为类型为foostruct的对象。这就是reinterpret_cast的作用 - 它将位模式重新解释为另一种类型的内存表示......