2009-05-06 80 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