1

我有一些 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做什么?

4

3 回答 3

4

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

于 2010-12-14T12:47:18.120 回答
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 也更容易......

于 2010-12-14T12:50:16.290 回答
2

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

于 2010-12-14T12:47:54.827 回答