1

データをネットワーク経由で送信するために、データを効率的にパックする方法を探していました。方法を提案するトピックを見つけました:http ://www.sdltutorials.com/cpp-tip-packing-data

また、商用アプリケーションで使用されていることも確認しました。そこで試してみることにしましたが、思った通りの結果にはなりませんでした。

  1. まず第一に、データを「パック」することの全体的なポイントは、バイトを節約することです。しかし、上記のアルゴリズムがバイトを節約しているとは思いません。なぜなら、パッキングなしで...サーバーは4バイト(データ)を送信するので、パッキング後、サーバーは4バイト長の文字配列を送信します...したがって、それは無意味です。

  2. それを除けば、なぜ誰かが0xFFを追加するのでしょうか、それは何もしません。

上記のチュートリアルにあるコードスニペット:

    unsigned char Buffer[3];
    unsigned int Data = 1024;
    unsigned int UpackedData;
    Buffer[0] = (Data >> 24) & 0xFF;
    Buffer[1] = (Data >> 12) & 0xFF;
    Buffer[2] = (Data >> 8) & 0xFF;
    Buffer[3] = (Data ) & 0xFF;
    UnpackedData = (Buffer[0] << 24) | (Buffer[1] << 12) | (Buffer[2] << 8) | (Buffer[3] & 0xFF);

結果:0040//4バイト長の文字1024//4バイト長

4

3 に答える 3

3

整数の場合、BER エンコーディングが便利な簡単な方法です。基本的に、符号なし整数の場合、各バイトに7ビットを書き込み、8番目のビットを使用して別のバイトが必要かどうかをマークします

void berPack(unsigned x, std::vector<unsigned char>& out)
{
    while (x >= 128)
    {
        out.push_back(128 + (x & 127)); // write 7 bits, 8th=1 -> more needed
        x >>= 7;
    }
    out.push_back(x); // Write last bits (8th=0 -> this ends the number)
}

符号付き整数の場合、最下位ビットで符号をエンコードし、以前と同じエンコーディングを使用します

void berPack(int x, std::vector<unsigned char>& out)
{
    if (x < 0) berPack((unsigned(-x) << 1) + 1, out);
          else berPack((unsigned(x) << 1), out);
}

このアプローチを使用すると、数値が小さいほど使用するスペースが少なくなります。もう 1 つの利点は、このエンコーディングがすでにアーキテクチャに依存しない (つまり、データはシステムのエンディアンに関係なく正しく理解される) ことと、同じフォーマットで異なる整数サイズを処理でき、32 ビット システムから別のシステムにデータを送信できることです。問題のない 64 ビット システム (もちろん、値自体がオーバーフローしていないと仮定します)。

たとえば、268435456 (1 << 28) から 4294967295 ((1 << 32) - 1) までの符号なし値には、標準の固定 4 バイト パッキングの 4 バイトではなく 5 バイトが必要になります。

于 2011-09-10T20:32:44.363 に答える
3

これ& 0xFFは、0 から 255 の間であることを確認することです。

私はその投稿をあまり信用しません。あなたの反論はさておき、コードには明らかな間違いがあります。Buffer要素の長さは 3 つだけですが、コードはデータを 4 つの要素に格納します。

于 2011-09-10T20:25:23.837 に答える
2
  1. パッキングのもう1つの理由は、一貫した構造を適用して、あるマシンで書き込まれたデータを別のマシンで確実に読み取ることができるようにすることです。

  2. 「追加」ではありません。LSB(最下位バイト)をマスクするためにビット単位のANDを実行しています。しかし、ここでは必要ないようです。

于 2011-09-10T20:23:59.380 に答える