2016-11-09 7 views
-3

uint8バッファに格納される可変ビット数のデータのシリアル化を処理する最も簡単な方法は何でしょうか?可変長データ型Cのバッファ内

たとえば、最初の4ビットは1変数、1ビットはブール値、もう1ビットは3ビットです。次に、8バイトの配列があり、次に13ビットの変数などがあります。これらはすべて、ソケットを介して送信されるunsigned charバッファに書き込まれます。

変数のデータ型は時々8ビット-16ビット境界に揃えるされていない、彼らは

それ最善を書くことでしょうなど、長い、13ビット長で、3ビット長7ビットのようなビットの奇妙#を、持っていますこのためのCの何か、または第三者図書館を使用するか?

+0

何ですか? XMLはあなたにとって十分ではありませんか? :) – infixed

+0

私は間違いなくすべての変数のヘッダーとしてバッファの一部を使用します。ヘッダーはデータ型の長さを格納し、データ型を表す列挙型のintを格納します。次に、それを使いたいときに型変換に変換関数を書くことができます。 – SenselessCoder

+0

@infixed:すべてのプラットフォームでXMLを使用することはできません! XMLは膨らんでいます。 – Olaf

答えて

1

タフな部分は本当に長さの符号化です。

たとえば、ゼロビットオプションがないと仮定して、255ビットを超える長さを持つことができなかった場合は、ストリームの次の8ビットを取得して長さを取得し、次にそのビット数を値を取得します。

セグメント単位で行うこともできます。長さとしてゼロを使用すると、255より大きい長さが意味されます。255ビットで読み込み、次のセグメント(同様に定義された長さを持つセグメント)に接頭辞を付けることで、チェーン化を維持できます。

より魅力的で、扱うべきビット長のセットがわかっていたら、Huffman Codeに長さを表すようにしてから、実際のビット値でハフマンコードを置き換えてください。

しかし、それは可能な長さを事前に知っていることになります。しかし、あなたは '次への連鎖'を言うためにハフマンコードを予約することもできます

上記のコメントからASCIIスキームを実装するためにハフマンコーディングを使用することもできますが、 '0'、 '1'そして「X」

単一のゼロ・ビットのシーケンスは、フィールド内の次のビットが別の続く一つの配列は、次のビットが「1」であることを意味する「0」

手段

0に続く1のシーケンスは、 'x、フィールドの終わりと同じことを意味する可能性があります