这真让我困惑,说我想将整数保存到文件中,int x = 56,二进制文件在内存中采用ascii等效的56表示 00000000 00000000 00000000 00111000,这将是:null null null 8并将其写入文件?我对么?有人可以解释这两个功能,以及我何时应该使用它们?即时通讯使用c#btw。提前谢谢!
答案 0 :(得分:20)
在StreamWriter和BinaryWriter的MSDN页面中,您可以清楚地看到差异:
的StreamWriter:
实现TextWriter以进行编写 字符到特定的流 编码
和
的BinaryWriter:
将二进制的原始类型写入a 流和支持写入字符串 特定的编码。
第一个用文本写东西,第二个用二进制写little endian,所以int x = 56
写成00111000 00000000 00000000 00000000
。
答案 1 :(得分:15)
二进制写入器写入整数的内存中二进制表示。流编写器写入ASCII表示。一般来说,前者可以更紧凑和高效(考虑写整数23861398 - 二进制写入器需要4个字节,但流编写器需要8,16甚至32,具体取决于编码)但后者导致普通旧文。
答案 2 :(得分:5)
从我能辨别的内容... StreamWriter更多用于文本,BinaryWriter用于原始类型,包括特定编码的字符串。说BinaryWriter用二进制写的东西虽然对于那些以表面看待事物的人来说是一种误导......正如我所做的那样。我假设当我向底层流写一个整数时,它实际上会用二进制写它,我可以再次读取它作为1和0的流。 按照代码查看事情:
MemoryStream stream = new MemoryStream();
BinaryWriter bw = new BinaryWriter(stream);
bw.Write(35);
// is equivalent to doing:
stream.Write(BitConverter.GetBytes((int)35), 0, 4);
虽然BinaryWriter使用位移提取字节而BitConverter使用不安全的指针转换,但结果是相同的。 int的长度为32位或4个字节,它只是将表示该int的字节写入其底层流。
StreamWriter只对文本执行相同的操作,因此整数不会转换为字节,而是转换为字符......这类似于编写:
byte[] buffer = Encoding.UTF8.GetBytes("my string here 1234");
stream.Write(buffer, 0, buffer.Length);
这就是为什么我说用二进制写它是误导的...因为它确实......技术上。将每个写入的字节分解为位,然后获得二进制值。但是,将原始类型写为字节数组会更有意义。如果您要将流转换为字符串,则不会得到1和0的字符串。
答案 3 :(得分:2)
StreamWriter
用于文本,BinaryWriter
写入您要写入的实际二进制表示。我不是100%肯定,但差不多:)。