gpt4 book ai didi

c# - StreamWriter 和 BinaryWriter 在写入字符串时是否可以互换

转载 作者:行者123 更新时间:2023-12-03 15:47:49 24 4
gpt4 key购买 nike

来自 StreamWriter 的 MSDN 页面和 BinaryWriter您可以清楚地看到差异:

StreamWriter:

Implements a TextWriter for writingcharacters to a stream in a particularencoding.


和:

BinaryWriter:

Writes primitive types in binary to astream and supports writing strings ina specific encoding.


我知道 BinaryWriter 最重要的特性是它可以用二进制写入原始类型,这样可以更紧凑和高效(考虑写入整数 23861398 - 二进制写入器需要 4 个字节,但流写入器需要 8、16 ,甚至 32,具体取决于编码)。
但是说到写字符串,我们能说StreamWriter和BinaryWriter可以互换吗?

最佳答案

来自 the BinaryWriter documentation :

Writes a length-prefixed string to this stream in the current encoding of the BinaryWriter, and advances the current position of the stream in accordance with the encoding used and the specific characters being written to the stream.


和:

Length-prefixed means that this method first writes the length of the string, in bytes, when encoded with the BinaryWriter instance's current encoding to the stream. This value is written as an unsigned integer. This method then writes that many bytes to the stream.

For example, the string "A" has a length of 1, but when encoded with UTF-16; the length is 2 bytes, so the value written in the prefix is 2, and 3 bytes are written to the stream, including the prefix.

StreamWriter类不会将任何字符串长度写入输出。它只是写文本本身
两者都尊重您在创建对象时指定的编码。正在编写的实际文本使用该编码。
因此,根据您所说的“可互换”的含义,它们要么是,要么不是。 我会说他们不是 ,但如果您所看到的只是代表所写文本本身的字节序列,人们可能会认为它们是。
要解决您的评论:

I'm new to BinaryWriter, so why it need to write length to the stream first? why not just write "real data" directly?


不像 StreamWriter ,只写一种数据, BinaryWriter可以将各种数据(包括原始字节和各种原始类型)写入单个 Stream .在编写其中每一个时,它需要一种指示特定数据部分在哪里结束的方法。就是这样 BinaryWriter的阅读对口, BinaryReader , 有一种方法可以知道每个数据部分的结束位置。
对于某些事情,这很简单,因为数据项本身是固定大小的。一个 System.Int32是 4 个字节,一个 System.Int64是 8,以此类推。它们是固定长度的,因此在读取时您只需读取预期的字节数。
但是 string对象是可变长度的。有两种常见的方法来处理这个问题:用计数作为字符串前缀,或用空字符( '\0' )终止字符串。内存中的 .NET 字符串被计算在内,而不是空终止,因此字符串对象实际上可以包含空字符,因此空终止字符串不适用于将字符串存储在文件中。
因此,改为使用带有字节数的前缀。

关于c# - StreamWriter 和 BinaryWriter 在写入字符串时是否可以互换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67303672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com