就我个人而言
把一个Int16放在字符串的开头,这样你就可以知道它们将会持续多长时间,并且
使用IO.BinaryReader类进行读取,它将"读取",整数,字符串,字符等变为变量,例如BinReader.ReadInt16()将读取两个字节,返回它们表示的int16,并在其中移动两个字节流
希望这可以帮助.
PS小心使用ReadString方法,它假定字符串前面有自定义的7位整数,即它是由BinaryWriter类编写的.以下是来自CodeGuru的帖子
BinaryWriter类有两种写字符串的方法:重载的Write()方法和WriteString()方法.前者根据类正在使用的编码将字符串写为字节流.WriteString()方法也使用指定的编码,但它将字符串的字节流作为字符串实际长度的前缀.这些带前缀的字符串通过BinaryReader.ReadString()读回.
关于长度值的有趣之处在于,尽可能少的字节用于保存此大小,它被存储为称为7位编码整数的类型.如果长度适合7位,则使用单个字节,如果大于此,则设置第一个字节的高位,并通过将值移位7位来创建第二个字节.这将以连续的字节重复,直到有足够的字节来保存该值.此机制用于确保长度不会成为序列化字符串占用的大小的重要部分.BinaryWriter和BinaryReader具有读取和写入7位编码整数的方法,但它们受到保护,因此只有从这些类派生时才能使用它们.
我会选择长度为前缀的字符串.它会让你的生活变得更简单,这意味着你可以用换行符来表示字符串.虽然对你的代码有一些评论:
不要使用Stream.DataAvailable.仅仅因为现在没有可用的数据并不意味着你已经阅读了流的结尾.
除非你绝对确定你永远不会需要超过ASCII的文本,否则不要使用ASCIIEncoding.
不要以为Stream.Read会读取您要求它的所有数据.始终检查返回值.
BinaryReader使这很容易很多(包括长度前缀的字符串和读取循环,直到它读取你要求的内容)
你在相同的数据上调用BitConverter.ToUInt16两次.为什么?