首页 > 解决方案 > 如何使用 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 值,那么我该如何实现这一点,请任何人都可以帮助我。

标签: c#.net

解决方案


如果您想继续进行疯狂的转换,您只需将结果转换intshort

 int decValue = 47454;
         // int.Parse(hex.ToString(), System.Globalization.NumberStyles.HexNumber);
 return (short)decValue;

转换为short将简单地修剪 2 个高字节的int结果表示负值,然后结果short-18082将自动转换-18082.0f为匹配返回类型。

请注意,short直接使用ReadInt16阅读可能是您想要的。


推荐阅读