私は特定のバイナリファイルを読み込もうとしていますが、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
をコピーして、わずかにそれを修正
3バイト整数の形式を知っていますか?余分なバイトを持つ標準のintと同じですか? –
@ M.Babcock:はい、そうです。それを除いてビッグエンディアン、私はそれを私のネイティブフォーマット(リトルエンディアン)に変換する必要があります。私が余分な0バイトでそれを埋め込むことができれば、私はきれいに読むことができるだろうが、私はそれを行う良い方法の確信していない。私はファイルの塊(例えば4 KiB)を読み込み、それをループして、必要に応じて異なる部分を変換したいと思います。通常、私は 'converter.GetInt32(theData、myOffset)'を呼び出すだけですが、次のバイトに読み込みますが、これは動作しません。 – mpen
これは、(Mono.DataConvertの)期待通りにサポートされているようには見えませんが、変換を行う3バイトの構造体を定義するのは難しいことではありません。それはとにかく楽しいプロジェクトのように思えます(RTMPを動作させるために使用しなければならないローリング7ビット整数よりも難しいはずはありません)。あなたはそれが 'int'であると考えていますが、私は典型的な2の補数記号が当てはまると仮定します。 \ –