Как работает этот reinterpret_cast?(Портирование C ++ на Java) - PullRequest
1 голос
/ 14 декабря 2010

У меня есть код 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 ]

4 голосов
/ 14 декабря 2010

в основном это говорит о том, что 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;

Iдумаю, что гораздо более очевидно, что делается тогда.Я думаю, вам также будет проще портировать на Java таким образом ...

4 голосов
/ 14 декабря 2010

Он делает то, что классический C-стиль (const foostruct *)buffer будет делать в худшем случае: говорит C ++ игнорировать всю безопасность и что вы действительно знаете, что делаете. В этом случае buffer на самом деле состоит из foostruct с, которые, в свою очередь, являются битовыми полями, перекрывающимися на 8-битных символах. По сути, вы можете сделать то же самое в Java, просто получив байты и выполнив операции shift и mask самостоятельно.

2 голосов
/ 14 декабря 2010

у вас есть указатель на unsigned char, верно? Теперь представьте, что биты, на которые указывает указатель, обрабатываются как объект типа foostruct. Это то, что делает reinterpret_cast - он интерпретирует битовый шаблон как представление памяти другого типа ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...