有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

这是如何重新解释的?(C++到java的移植)

<>我有一些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) 个答案

  1. # 1 楼答案

    <> P>它做了一个经典的C样式^ {< CD1>}最坏的操作:告诉C++忽略所有的安全性,并且你真的知道你在做什么。在这种情况下,buffer实际上由foostruct组成,而这些foostruct又是叠加在单个8位字符上的位字段。本质上,在Java中也可以这样做,只需获取字节并自己执行移位和掩码操作

  2. # 2 楼答案

    你有一个指向无符号字符的指针,对吗?现在假设指针指向的位被视为foostruct类型的对象。这就是reinterpret_cast所做的-它将位模式重新解释为另一种类型的内存表示

  3. # 3 楼答案

    它的基本意思是,当前指针上表示的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更容易