当前位置: 首页 > 编程语言 > C#

使用System.IO.BinaryWriter写字符串和char数组的区别分享

时间:2023-04-10 14:21:55 C#

使用System.IO.BinaryWriter写字符串和char数组的区别一个二进制文件,并查看写入字符串和字符数组之间的差异。我正在使用System.IO.BinaryWriter并在编写时观察BinaryWriter.BaseStream.Length。这些是我的结果:using(BinaryWriterbw=newBinaryWriter(File.Open("data.dat"),Encoding.ASCII)){字符串值="Foo";//写入4个字节bw.Write(value);//写入3个字节bw.Write(value.ToCharArray());我不明白为什么当我只写3个ASCII字符时字符串重载会写4个字节。谁能解释一下?BinaryWriter.Write(string)的文档指出它将长度前缀字符串写入此流。Write(char[])的重载没有这样的前缀。在我看来,额外的数据就是长度。编辑:为了更明确一点,使用Reflector。您会看到它是Write(string)方法的一部分,其中包含以下代码:this.Write7BitEncodedInt(byteCount);这是一种使用尽可能少的字节对整数进行编码的方法。对于短字符串(我们每天使用少于128个字符),可以用一个字节来表示。对于更长的字符串,它开始使用更多字节。这是您感兴趣的函数的代码:protectedvoidWrite7BitEncodedInt(intvalue){uintnum=(uint)value;while(num>=0x80){this.Write((byte)(num|0x80));数=数>>7;}this.Write((byte)num);在使用此编码作为长度前缀后,它会以所需的编码写入字符的字节。来自BinaryWriter.Write(string)文档:以BinaryWriter的当前编码将长度前缀字符串写入此流,根据使用的编码和写入流的特定字符推进流的当前位置。这种行为可能是这样的,当使用BinaryReader读回文件时,字符串被识别。(例如,3Foo3Bar6Foobar可以解析为字符串“Foo”、“Bar”和“Foobar”,但FooBarFoobar不能。)实际上,BinaryReader.ReadString正是使用此信息从二进制文件中读取字符串。来自BinaryWriter.Write(char[])文档:将字符数组写入当前流,并根据使用的编码和写入流的特定字符推进流的当前位置。很难夸大MSDN上文档的全面性和实用性。请务必先检查它们。如前所述,BinaryWriter.Write(String)在写入字符串本身之前将字符串的长度写入流。这允许BinaryReader.ReadString()知道字符串的长度。使用(BinaryReaderbr=newBinaryReader(File.OpenRead("data.dat"))){stringfoo1=br.ReadString();char[]foo2=br.ReadChars(3);}你看实际写的是什么?我猜是一个空终止符。以上就是C#学习教程的全部内容:用System.IO.BinaryWriter写字符串和char数组的区别。如果对你有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络合集,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: