C# 如何使用 Binary Writer 知道字符串的长度?

问题描述 投票:0回答:1

请看下面的代码。这个程序只是保存了一个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();
        }
    }
}

这是它的二进制表示:

Binary Representation of Writing Result

显然,第一个开头的“ox21”是字符串的长度 - 但 C# 到底是怎么知道的?

serialization binary
1个回答
0
投票

在我最初的问题一年多后,我终于找到了答案 - 当 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 字母

!

Image

请注意,在原始图像中,十六进制值总共有 35 个字节长!这是因为其中包括:

  1. 第一个字节是字符串的长度(x1字节,值= 33)
  2. 接下来的33个字节是实际的字符串(x3字节)
  3. 最后一个字节是额外的
    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() 写入字符串

© www.soinside.com 2019 - 2024. All rights reserved.