c# - 为什么 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 类。这样做的目的是为了研究我不是想为一个项目解决问题。
解决方案
问题是下面的行
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 个字节,将其从十进制数转换0x02
为0x020000
131702
如果格式是大端,那么你会看到 int 得到不正确的值0x00
推荐阅读
- java - 在 JComponent 上绘制圆圈时 repaint() 的行为
- ruby-on-rails - Sidekiq 不使用 Docker 处理排队作业设置
- gradle - 未解决的参考:build.gradle.kts 中的 compileKotlin
- java - Tomcat服务器和Tomcat之间的Spring自动装配空字段以编程方式启动
- powershell - 如何将主文件夹和 Active Directory 与复制/删除文件夹进行比较?
- android - 清洁架构中具有多个响应列表的用例
- typescript - 测试涉及打开文件夹/工作区的 VSCode 扩展
- bootstrap-4 - 屏幕分辨率小于 576px 的 boostrap-grid 中的 react-slick
- azure - 找不到如何加载包含 Get-MsolUser 的库
- c - 如何为此方法格式化字符串?