2009-05-06 78 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); 

您不能將數據解碼爲字符串,因爲它不是首先編碼的字符串。無論使用哪種編碼,二進制數據總是可以包含字節序列,這些字節序列不代表編碼文本產生的任何內容。

1

你的第二種方法更好。雖然第一種方法可行,但您可能會遇到編碼問題。

如果您需要將數據插入XML文檔,請使用Convert.ToBase64String(yourByteArray);。要從字符串中獲得byte[],請使用Convert.FromBase64String(yourStringFromXML);

2

StreamReader將讀取文件,就好像它是文本一樣,但不是。所以是的,你必須使用BinaryReaderFileStream來讀取你的數據。實際上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 2009-05-06 14:55:23

+0

糟糕!您忘記檢查Read方法的返回值。不能保證讀取您請求的所有數據,因此您必須檢查其實際讀取的數量以確保獲取整個文件。 – Guffa 2009-05-06 17:22:35