1

整数値をバッファとの間で読み書きするために使用される単純なプロトコルを開発しています。整数の大部分は 128 未満ですが、はるかに大きな値が可能であるため、値を簡潔な方法で格納するための何らかの形式のマルチバイト エンコーディングを検討しています。

プラットフォームに依存しない (つまり、バイト順にとらわれない) 方法でマルチバイト値を読み書きする最も簡単で最速の方法は何ですか?

4

5 に答える 5

3

XDR形式が役立つ場合があります。それを1つの文に要約する必要がある場合、それは整数の一種のバイナリUTF-8です。

編集:以下のコメントで述べたように、私はオフィスの仕事でいくつかのXDR関連の機能を使用しているため、XDRを「知っています」。あなたのコメントの後で初めて、私が毎日使用している「パックされたXDR」フォーマットは、公式のXDRドキュメントの一部でもないことに気づきました。そのため、個別に説明します。

したがって、アイデアは次のとおりです。

  • バイトの最上位ビットを検査します。
    • 0の場合、そのバイト値です。
    • 1の場合、次の3ビットは「バイトカウント」、つまり値のバイト数を示します。
      • トップニブル(フラグビットとバイトカウント)をマスクし、適切なバイト数を連結すると、値が得られます。

これが「実際の」形式なのか、私の(元の)同僚が自分で作成したのかはわかりません(そのため、コードを投稿しません)。

于 2011-06-06T14:45:18.303 に答える
2

次の機能に興味があるかもしれません。

htonl、htons、ntohl、ntohs - ホストとネットワークのバイト順の間で値を変換します

   uint32_t htonl(uint32_t hostlong);
   uint16_t htons(uint16_t hostshort);
   uint32_t ntohl(uint32_t netlong);
   uint16_t ntohs(uint16_t netshort);

man byteorder

于 2011-06-06T14:47:54.787 に答える
2

テキストは私の最初の選択です。可変長のバイナリ エンコーディングが必要な場合は、次の 2 つの基本的な選択肢があります。

  • 長さ表示
  • エンドマーカー

明らかに、それらをいくつかの値ビットとマージします。

  • 長さといくつかのビットが一緒に与えられたものを与える長さの表示については (たとえば、UTF-8 を参照)、

  • エンド マーカーの場合、たとえば、MSB セットが最後のバイトを示し、1 バイトあたり 7 データ ビットであると述べることができます。

他の変形は明らかに可能です。

于 2011-06-06T14:50:10.700 に答える
1

Google のプロトコル バッファは、可変幅エンコーディングを使用する事前に作成された実装を提供します。

于 2011-06-06T14:56:16.930 に答える
1

Network Byte Orderを試すことができます

于 2011-06-06T14:48:02.733 に答える