我有一些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 正在做?

有帮助吗?

解决方案

基本上说,在当前指针上代表的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 ...

其他提示

它做了经典的C风格 (const foostruct *)buffer 最糟糕的是:告诉C ++忽略所有安全性,并且您真的知道自己在做什么。在这种情况下, buffer 实际上是 foostructs,这又是在单个8位字符上覆盖的位字段。从本质上讲,您可以通过获得字节并自己进行轮班和掩盖操作来在Java中做同样的事情。

您有一个指针指向未签名的字符吧?现在想象一下,指针指向的位被对待,好像它是类型的对象。这就是reinterpret_cast所做的 - 它将位模式重新解释为另一种类型的内存表示...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top