我有一些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
在做什么?
答案 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的作用 - 它将位模式重新解释为另一种类型的内存表示......