2009-05-06 12 views
2

私は画像ファイルへのパスを取り、バイナリデータを文字列として返す関数を用意しています。呼び出し側は、返された文字列をXML要素の内部テキストに挿入します。バイナリデータと文字データの混同

は、この正しい?:

string dataAsString = ""; 
using (StreamReader sr = new StreamReader(new FileStream(mergedFile, FileMode.Open, FileAccess.Read, FileShare.Read, 2048, FileOptions.DeleteOnClose)))   
dataAsString = sr.ReadToEnd(); 
return dataAsString; 

これは、それが合法的にバイナリデータであるかもしれないようなものを返しますが、私は、対象ファイルのうち、内容をカット&ペーストした場合、新しいテストTIFファイルに貼り付けですtifイメージを開こうとすると、それは私には不幸です...私はデータの読み書き方法が間違っていると思います。

私は本当にこれを行う必要がありますか?

using (BinaryReader br = new BinaryReader(new FileStream(mergedFile, FileMode.Open, FileAccess.Read, FileShare.Read, 1024, FileOptions.None)))  
{ 
    int blockReadSz = 2048; 
    int bytesToRead = (int)br.BaseStream.Length; 
    int bytesRead = 0; 
    byte[] data = new byte[bytesToRead]; 
    while (bytesRead < bytesToRead)   
    bytesRead += br.Read(data, bytesRead, blockReadSz);  
} 

もしそうなら、一度ファイルを読み終えたら、バイト[]から文字列を取り出すにはどうすればよいですか?

ありがとうございました! :D

答えて

3

何が本当に意味がありませんを求めています。バイナリデータを文字列に読み込むことはできません。

あなたは簡単にBinaryReaderを使用せずにバイト配列にデータを読み取ることができます。

byte[] data = File.ReadAllBytes(mergedFile); 

あなたは、XML文書内のデータを入れたい場合は、使用して、たとえば、何とかテキストとしてそれを表現するために持っていますbase64エンコーディング:

string text = Convert.ToBase64String(data); 

最初にエンコードされた文字列ではないため、データを文字列にデコードすることはできません。どのようなエンコーディングを使用しても、バイナリデータには常に、エンコーディングテキストによって生成されるものを表さないバイトシーケンスが含まれます。

+0

File.ReadAllBytesが優れています。それを忘れてしまった! +1 – Keltex

+0

ああ。 ReadAllBytesは便利です。 +1も同様です。 :D – cakeforcerberus

1

2番目の方法が優れています。最初のアプローチは機能しますが、エンコードの問題が発生する可能性があります。

XML文書にデータを挿入する必要がある場合は、Convert.ToBase64String(yourByteArray);を使用します。文字列からbyte[]を返すには、Convert.FromBase64String(yourStringFromXML);

2

StreamReaderは、あたかもそれがテキストであるかのようにファイルを読み込みます。したがって、データを読むにはBinaryReaderまたはFileStreamを使用する必要があります。実際にはBinaryReaderはここでは冗長です。 FileStreamはそれ自身で動作します。 FileStream.Readを使用してください。ファイルが文字列に入れるのに十分短いので、次のコードが役に立ちます。

using (FileStream fs = new new FileStream(mergedFile, FileAccess.Read))   
{ 
    int length = (int) fs.Length; 
    byte[] data = new byte[length]; 
    fs.Read(data, 0, length); 
    // convert to string here... TBD 
} 

次に、バイナリデータを文字列に変換します。これは、この文字列をどのように表現するかによって異なります。それはASCIIだ(とあなたは各バイトが文字に変換したい)場合は、このような何かをするだろう:

string myString = System.Text.Encoding.UTF8.GetString(data); 
+0

ありがとうございます! :) – cakeforcerberus

+0

おっと! Readメソッドの戻り値をチェックするのを忘れた。あなたが要求したすべてのデータを読むことは保証されていないので、ファイル全体を確実に取得するために実際に読み取った量を確認する必要があります。 – Guffa

関連する問題