私はいくつかのバイナリファイルの解析をスムーズにしようとしていますが、私は動作するものの、可変フィールドがある状況があります。即時に任意のビット数を読み取るためのアプローチ
は、私はすべて私がデータのほとんどはので、私は先に行ってきたoptionalsの唯一の特定のセットを使用しています
1-bit field
1-bit field
1-bit field
11-bits field
1-bit field
(optional) 4-bit field
(optional) 4-bit field
1-bit field
2-bit field
(optional) 4-bit field
5-bit field
6-bit field
(optional) 6-bit field
(optional) 24-bit field
(junk data - up until byte buffer 0 - 7 bits as needed)
つかむ
デフォルトのケースで働く私の解析および処理するためのクラスを書き始めましたそのデータ。私の一般的なアプローチは、ポインタ構造を作成し、そこからバイト配列を構築することである。
let rawData: NSMutableData = NSMutableData(data: input_nsdata)
var ptr: UnsafeMutablePointer<UInt8> = UnsafeMutablePointer<UInt8(rawData.mutableBytes)
bytes = UnsafeMutableBufferPointer<UInt8>(start: ptr, count: rawData.length - offset)
だから私は[UInt8]
の配列で作業を終わると、私はと同様に、私の構文解析を行うことができます。
let b1 = (bytes[3] & 0x01) << 5
let b2 = (bytes[4] & 0xF8) >> 3
return Int(b1 | b2)
私が問題に遭遇するところでは、オプションのフィールドがあります。なぜなら、私のデータはバイト境界上にあるわけではなく、すべてが複雑になるからです。理想的な世界では、私はおそらくポインタで直接作業し、必要に応じてバイト単位で進めますが、3ビットでポインタを前進させる方法はありません - 私の質問に私をもたらします
私の状況を処理する最善の方法は何ですか?
私は、ビット配列のパック構造を素早く作成する方法がわからないことを除いて、オプションのフィールドを反映するさまざまな構造を思いついたと考えました。
私の最善のアプローチは何ですか?明確化のために、最初の1-bit
フィールドは、オプションフィールドのいずれが設定されるかを決定します。
、私は単に[CFBitVector](https://developer.appleを使用します。 com/library/mac/documentation/CoreFoundation/Reference/CFBitVectorRef /)を参照してください。 –
@SamR .: CFBitVectorは大規模なビットセットを管理するのに便利ですが、何かを見落とさない限り、おそらくバイト境界を越えて複数のビットに格納されている数値を取得するのに役立ちません。 1つのフィールドのすべてのビットを別々に取得し、これらから数を構築することは、あまり効果的ではないでしょう。 –