请看下面的代码。这个程序只是保存了一个33个字符长度的字符串“!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!”附加字节值“33”。
using System.Text;
namespace Test
{
internal class Program
{
static void Main(string[] args)
{
string filepath = args[0];
using (var stream = File.Open(filepath, FileMode.Create))
{
using (var writer = new BinaryWriter(stream, Encoding.UTF8, false))
{
writer.Write(new string('!', 33));
writer.Write((byte)33);
}
}
using (var stream = File.Open(filepath, FileMode.Open))
{
using (var reader = new BinaryReader(stream, Encoding.UTF8, false))
{
Console.WriteLine(reader.ReadString());
Console.WriteLine(reader.ReadByte());
}
}
Console.ReadKey();
}
}
}
这是它的二进制表示:
显然,第一个开头的“ox21”是字符串的长度 - 但 C# 到底是怎么知道的?
在我最初的问题一年多后,我终于找到了答案 - 当 BinaryWriter 写入字符串时,它首先写入字符串的长度。
using static System.Text.Encoding;
var test = "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
Console.WriteLine(UTF8.GetBytes(test).Length); // We get 33, meaning the string itself is only 33 characters.
在原来的问题中,第一个 ox21 表示字符串的长度 - 它恰好对应于 ASCII 字母
!
。
请注意,在原始图像中,十六进制值总共有 35 个字节长!这是因为其中包括:
Write()
输出(x1 字节,值 = 33)注意当字符串长度超过 1 个字节时会发生什么:
using static System.Text.Encoding;
var longString = new string('!', 256);
UTF8.GetBytes(longString); // Gives an array with length 256
var memory = new MemoryStream();
var writer = new BinaryWriter(memory);
writer.Write(longString);
memory.ToArray(); // Gives the serialized bytes, which is 258 in length!
上面的前三个字节(小端): 128 2 33
请参阅此内容以获取全面概述:如何 BinaryWriter.Write() 写入字符串