2

テキストとバイナリ イメージ内に存在するファイルがあり、問題のテキストの位置を 0 から 30 まで読み取る必要があり、31 の位置はバイナリ形式のイメージになります。その問題を解決するには、どのような手順を踏む必要がありますか?

現在、を使用して読み取ろうとしており、次に示すようFileStreamに FileStream var を 1 つに移動します。BinaryReader

FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)
BinaryReader br = new BinaryReader(fs)

そこから先、道に迷っています。


アップデート

よし、これでファイルを読めるようになった。位置 30 までは私の 30 文字列であり、位置 30 からは実際には画像であるビット文字列です。30 番目の位置からバイトを読み取り、画像を保存するにはどうすればよいのでしょうか。誰にもアイデアはありますか?私のファイルの例に従ってください。いくつかのアイデアがあります。

£ˆ‰¢@‰¢@¢–”…@•…¦@„£@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.-///%<<??@[K}@k{M÷]kðñôôô}ù~øòLKóôòÿg

@ @ @ も私の文字列であり、そこから画像は 1 バイトになることに注意してください。

4

2 に答える 2

3

いくつかのコードを使用して、ロジャーの答えを少し拡張します。

文字列は常に何らかの形式でエンコードされており、それを読み取るには、そのエンコードを知っている必要があります(特にバイナリリーダーを使用している場合)。多くの場合、これはプレーンASCIIであり、予期しない結果(奇妙な文字など)が発生した場合は、Encoding.ASCII.GetStringを使用して解析し、別のエンコーディングを試すことができます。

画像を解析するには、画像パーサーを使用する必要があります。.NETには、GUI名前空間の一部としていくつかあります。以下のサンプルでは、​​System.Drawing(Windowsフォーム)からのものを使用していますが、同様のものがWPFに存在し、そこには多くのサードパーティライブラリがあります。

using (var reader = new BinaryReader(File.Open(someFile, FileMode.Open))
{
    // assuming your string is in plain ASCII encoding:
    var myString = System.Text.Encoding.ASCII.GetString(reader.ReadBytes(30));
    // The rest of the bytes is image data, use an image library to process it
    var myImage = System.Drawing.Image.FromStream(reader.BaseStream);
}

現在、MSDNは、BaseStreamをBinaryReaderと組み合わせて使用​​することについて注意を払っていますが、上記の場合は、イメージの後にストリームを使用していないため、安全であると思います。しかし、問題に注意してください。失敗した場合は、いつでもバイトを新しいバイトに読み込んで、byte[]それらのバイトから新しいMemoryStreamを作成できます。

編集:

コメントで、文字列がEBCDICであることを示しました。これは、残念ながら、組み込みのエンコーディングを使用して文字列をデコードできないことを意味します。グーグルですばやく検索すると、JonSkeetによるEBCDIC.NETエンコーディングクラスへの投稿が見つかりました。それは本質的にあなたに与えるでしょうebcdicEncoding.GetString(...);

于 2011-01-05T13:04:15.740 に答える
2

FileStreamを使用して、ファイルを開いて読み取ることができます。最初の 30 バイトをバッファーに読み込むと、"string Encoding.ASCII.GetString(byte[] buffer, int offset, int length)" を使用してそれを文字列に変換できます。

于 2011-01-05T12:29:57.480 に答える