我正在创建一个二进制文件,为此我正在使用
namespace BinaryStream
{
class Program
{
static void Main(string[] args)
{
string filename = @"c:\happybirthday.txt";
using (BinaryWriter binWriter =
new BinaryWriter(File.Open(filename, FileMode.Create)))
{
string name = "Sachin";
string wishes = "happy birthday";
binWriter.Write(name.ToCharArray());
binWriter.Write(wishes.ToCharArray());
}
}
}
}
如果使用binWriter.Writer(name),则该文件包含一些特殊字符。但是,如果我将字符串转换为chararray并写入文件,该文件包含普通文本(没有任何特殊字符)。
这背后的原因是什么?
答案 0 :(得分:2)
Write(string)
重载的长度为前缀:
从这里开始:http://msdn.microsoft.com/en-us/library/yzxa6408.aspx
以长度为前缀的字符串表示前缀为的字符串长度 字符串是包含其长度的单个字节或单词 串。此方法首先将字符串的长度写为UTF-7 编码无符号整数,然后将多个字符写入 通过使用BinaryWriter实例的当前编码进行流式传输。
而Write(char[])
不是。当打开文本时,这些额外信息将显示为奇怪的数据。
在查看阅读行为时,这一点很明显。需要告诉BinaryReader.ReadChars
要读取多少个字符,而BinaryReader.ReadString
通过查看长度前缀来解决问题。
修改:可能重复,额外的信息:Difference in writing string vs. char array with System.IO.BinaryWriter
答案 1 :(得分:1)
BinaryWriter.Write(string)写入第一个长度,然后将该字符串写入文件中。所以你在文件中找到了指向该字符串长度的特殊字符。
此功能的Msdn描述:
以长度为前缀的字符串表示字符串长度,方法是在字符串前面加上包含该字符串长度的单个字节或单词。此方法首先将字符串的长度写为UTF-7编码的无符号整数,然后使用BinaryWriter实例的当前编码将该多个字符写入流中。