为什么 BinaryReader.ReadDecimal() 返回错误值?

Ron*_*ano 0 c# stream

我将数据类型值存储到文件中然后使用它,但得到了错误的结果。我需要做什么才能得到正确的结果?

        BinaryWriter bw = new BinaryWriter(file.OpenWrite());
        string str = "Lalisa";
        int num = 10;
        decimal dec = 2;
        bw.Write(str);
        bw.Write(num);
        bw.Write(dec);
        bw.Close();

        BinaryReader br = new BinaryReader(file.OpenRead());
        Console.WriteLine(br.ReadString()); 
        Console.WriteLine(br.ReadInt16());
        Console.WriteLine(br.ReadDecimal());
        br.Close();

        /*
         output:
         Lalisa
         10
         131072
         */
Run Code Online (Sandbox Code Playgroud)

写入器输出

作者制作的文件

注意* 我正在使用 FileInfo 类作为流。这样做的目的是为了学习,我并不是想解决一个项目的问题。

Vik*_*ram 5

问题是下面一行

Console.WriteLine(br.ReadInt16());
Run Code Online (Sandbox Code Playgroud)

您正在写入一个 32 位整数,但只读回 16 位,这会导致后续读取出现问题。

你应该有

Console.WriteLine(br.ReadInt32());
Run Code Online (Sandbox Code Playgroud)

这应该可以解决你的问题

解释:

字节以 Little Endian 格式写入,因此 10 个 int 和 2 个十进制写入如下。方括号用于标记 和 的开始和int结束decimal

[0A 00 00 00] [02 00 00 00...00]
Run Code Online (Sandbox Code Playgroud)

但是,当您将 int 读取为 16 位值时,这就是您对要读取的位进行分组的方式

[0A 00] [00 00 02 00 00 00...00]
Run Code Online (Sandbox Code Playgroud)

正如您所注意到的,int在此过程中并没有受到影响,仍然被读为0x000A,但小数点移动了 2 个字节,将其从 切换0x020x020000十进制数 131702

如果格式是大尾数,那么您会看到 int 得到错误的值0x00