1

Java に移植しようとしている C++ コードがいくつかあります。次のようになります。

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ですか?

4

3 に答える 3

4

これは、古典的な C スタイル(const foostruct *)bufferが最悪の場合に行うことを行います。つまり、C++ にすべての安全性を無視し、自分が何をしているのかを本当に知っているように指示します。この場合、 はbuffer実際にはfoostructs で構成されており、これらは単一の 8 ビット文字に重ねられたビット フィールドです。基本的に、バイトを取得し、シフトおよびマスク操作を自分で行うだけで、Java でも同じことができます。

于 2010-12-14T12:47:18.120 に答える
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に移植する方が簡単だと思うかもしれません...

于 2010-12-14T12:50:16.290 に答える
2

あなたは unsigned char へのポインタを持っていますか?ここで、ポインターが指すビットが foostruct 型のオブジェクトであるかのように扱われると想像してください。それがreinterpret_castの機能です-ビットパターンを別のタイプのメモリ表現に再解釈します...

于 2010-12-14T12:47:54.827 に答える