好的,所以我有一个函数可以获取图像文件的路径,并且应该将二进制数据作为字符串返回。然后,调用者将返回的字符串插入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
答案 0 :(得分:3)
你所要求的并没有多大意义。您无法将二进制数据读入字符串。
您可以轻松地将数据读入字节数组,而无需使用BinaryReader
:
byte[] data = File.ReadAllBytes(mergedFile);
如果要将数据放在XML文档中,则必须以某种方式将其表示为文本,例如使用base64编码:
string text = Convert.ToBase64String(data);
您不能将数据解码为字符串,因为它不是首先编码的字符串。无论使用何种编码,二进制数据都可以包含不代表通过编码文本生成的任何内容的字节序列。
答案 1 :(得分: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(并且您希望每个字节转换为char),您将执行以下操作:
string myString = System.Text.Encoding.UTF8.GetString( data );
答案 2 :(得分:1)
你的第二种方法更好。虽然第一种方法可以使用,但您可能会遇到编码问题。
如果需要将数据插入XML文档,请使用Convert.ToBase64String(yourByteArray);
。要从字符串中获取byte[]
,请使用Convert.FromBase64String(yourStringFromXML);