0

struct.unpackPython の関数と同様に、C++ のバイナリ データから float または double を読み取ることができる必要があります。私の問題は、受信するデータが常にビッグエンディアンになることです。here で説明されているように、整数値に対してこれを処理しましたが、バイトごとに作業すると、浮動小数点値では機能しません。Python で使用する方法と同様に、C++ で浮動小数点値 (32 ビットfloatと 64 ビットの両方) を抽出する方法が必要です。doublestruct.unpack(">f", num)struct.unpack(">d", num)

これが私が試したものの例です:

stuct.unpack("d", num) ==> *(double*) str; // if str is a char* containing the data

リトル エンディアンの場合strは問題なく動作しますが、ビッグ エンディアンの場合はそうではありません。問題は、環境のネイティブ エンディアンがどうなるかわからないことです。そのため、バイナリ データを常にビッグ エンディアンとして抽出できる必要があります。

リンクされた質問を見ると、これは整数値に対してビットごとの論理和とビットシフトを簡単に使用していることがわかりますが、その方法は浮動小数点に対しては機能しません。

注意先に指摘しておくべきでしたが、c++11 や Boost 以外のサードパーティ製ライブラリは使用できません。

4

2 に答える 2

0
void ByteSwap(void * data, int size)
{
    char * ptr = (char *) data;
    for (int i = 0;  i < size/2;  ++i)
        std::swap(ptr[i], ptr[size-1-i]);
}

bool LittleEndian()
{
    int test = 1;
    return *((char *)&test) == 1;
}

if (LittleEndian())
    ByteSwap(&my_double, sizeof(double));
于 2012-12-14T17:38:58.520 に答える