此reinterpret_cast如何工作? (将C ++移植到Java)
-
09-10-2019 - |
题
我有一些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
实际上是 foostruct
s,这又是在单个8位字符上覆盖的位字段。从本质上讲,您可以通过获得字节并自己进行轮班和掩盖操作来在Java中做同样的事情。
您有一个指针指向未签名的字符吧?现在想象一下,指针指向的位被对待,好像它是类型的对象。这就是reinterpret_cast所做的 - 它将位模式重新解释为另一种类型的内存表示...
不隶属于 StackOverflow