首页 > 解决方案 > 为什么 BinaryReader.ReadDecimal() 返回错误值?

问题描述

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

        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
         */

写入器输出

作者制作的文件

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

标签: c#stream

解决方案


问题是下面的行

Console.WriteLine(br.ReadInt16());

您正在写入一个 32 位整数,并且只读取 16 位,从而导致后续读取出现问题。

你应该有

Console.WriteLine(br.ReadInt32());

这应该可以解决您的问题

解释:

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

[0A 00 00 00] [02 00 00 00...00]

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

[0A 00] [00 00 02 00 00 00...00]

正如您所注意到的,int在此过程中不会受到影响,并且仍被读取为0x000A,但小数点移动了 2 个字节,将其从十进制数转换0x020x020000131702

如果格式是大端,那么你会看到 int 得到不正确的值0x00


推荐阅读