c# - 如何使用 BinaryReader.ReadBytes(Int32) 读取负二进制数据
问题描述
我有一个二进制数据文件,它还包含一些负值和正值,并以 2 的补码形式存储。
每当我尝试使用BinaryReader
类读取这些数据时,我总是得到正数。
private double nextByte(BinaryReader reader)
{
byte[] bValue = reader.ReadBytes(2);
StringBuilder hex = new StringBuilder(bValue.Length * 2);
foreach (byte b in bValue)
hex.AppendFormat("{0:x2}", b);
int decValue = int.Parse(hex.ToString(), System.Globalization.NumberStyles.HexNumber);
return Convert.ToDouble(decValue);
}
例如:
让我们考虑数据文件包含1011100101011110
. 等效的十进制值为 47454,带符号 2 的补码的十进制值为 -18082。
这些BinaryReader.ReadBytes(2)
方法将始终返回 +ve 值,但我将 -18082 值除外。
问题是数据文件同时包含 +ve 和 -ve 值,那么我该如何实现这一点,请任何人都可以帮助我。
解决方案
如果您想继续进行疯狂的转换,您只需将结果转换int
为short
:
int decValue = 47454;
// int.Parse(hex.ToString(), System.Globalization.NumberStyles.HexNumber);
return (short)decValue;
转换为short
将简单地修剪 2 个高字节的int
结果表示负值,然后结果short
值-18082
将自动转换-18082.0f
为匹配返回类型。
请注意,short
直接使用ReadInt16阅读可能是您想要的。
推荐阅读
- r - 如何在 R 中使用宏变量
- python - 有人可以举一个“operator.index()”的例子吗?
- php - Nginx 上的 Symfony4 和 WordPress 兼容性问题
- spring - 如何使用 Spring Boot Starter Data Cassandra 同时连接多个 cassandra 集群
- linux - nginx安装问题,不知道怎么解决
- exchange-server - EWS 日历与会者
- r - 从 R 中的 200 个样本中识别最小值
- c - 保存的网格丢失材质
- sql - SQL 错误 4104:无法绑定多部分标识符
- java - LWJGL 碰撞 3D OpenGL