2012-02-17 5 views
1

私は特定のバイナリファイルを読み込もうとしていますが、3バイトのビッグエンディアンの整数を含んでいます。私は最近、Mono DataConvertに出くわしました。これらの3バイトの整数を除いて、私が欲しいものの大部分にはいいはずです。私はそれらを読む方法がわかりません。私はそれらを3バイトの整数として保持する必要はないことに注意してください。通常の数値を読むと、Int32が理想的です。私はデータの良い塊で読んでいるので、私は効率的なものを探しています。助言がありますか?Mono DataConvertを使用して3バイト整数を読み取ることはできますか?


サンプルの理想的なコード:

public Region(string regionFile) 
{ 
    var conv = DataConverter.BigEndian; 
    var chunks = new Chunk[Chunk.MaxLocations]; 
    using (var fs = File.OpenRead(regionFile)) 
    { 
     var buffer = new byte[4096]; 
     fs.Read(buffer, 0, buffer.Length); 

     // Read chunk locations 
     for (int i = 0; i < Chunk.MaxLocations; ++i) 
     { 
      chunks[i] = new Chunk(conv.ToInt24(buffer, i * 4), buffer[i * 4 + 3]); 
     } 
    } 
} 

は、私は存在しませんconv.ToInt24を除き、そのようなことをしたいです。私はMonoのGetInt32をコピーして、わずかにそれを修正

+0

3バイト整数の形式を知っていますか?余分なバイトを持つ標準のintと同じですか? –

+0

@ M.Babcock:はい、そうです。それを除いてビッグエンディアン、私はそれを私のネイティブフォーマット(リトルエンディアン)に変換する必要があります。私が余分な0バイトでそれを埋め込むことができれば、私はきれいに読むことができるだろうが、私はそれを行う良い方法の確信していない。私はファイルの塊(例えば4 KiB)を読み込み、それをループして、必要に応じて異なる部分を変換したいと思います。通常、私は 'converter.GetInt32(theData、myOffset)'を呼び出すだけですが、次のバイトに読み込みますが、これは動作しません。 – mpen

+0

これは、(Mono.DataConvertの)期待通りにサポートされているようには見えませんが、変換を行う3バイトの構造体を定義するのは難しいことではありません。それはとにかく楽しいプロジェクトのように思えます(RTMPを動作させるために使用しなければならないローリング7ビット整数よりも難しいはずはありません)。あなたはそれが 'int'であると考えていますが、私は典型的な2の補数記号が当てはまると仮定します。 \ –

答えて

0

...私はビットシフトによって自分自身を書くことができると思います:

public override int GetInt24(byte[] data, int index) 
{ 
    if (data == null) 
     throw new ArgumentNullException("data"); 
    if (data.Length - index < 3) 
     throw new ArgumentException("index"); 
    if (index < 0) 
     throw new ArgumentException("index"); 

    int ret = 0; 
    byte* b = (byte*)&ret; 

    for (int i = 0; i < 3; i++) 
     b[2 - i] = data[index + i]; 

    return ret; 
} 

が動作しているようです。

+0

ストライク。私は今それを見る。長い一日だった。 –

関連する問題