在C#中将二进制值转换为双精度浮点数时出现错误。

3

我正在尝试读取一个由c++程序创建的二进制文件。 该文件包含一些double数字,当我尝试读取它们时,我得到了一个错误的double值。

这是从文件中读取的十六进制值:

00-67-CC-02-B3-F7-40-CA

期望值:

0.2051076530529798

实际值:

-4.9596277989715114E+49

二进制文件类型:doublec++中为8字节。

c#中的转换输出为:doublebinaryreader.ReadDouble())。

以下是代码:

reader = new BinaryReader(File.Open(path, FileMode.Open), Encoding.Default);

double value = reader.ReadDouble();

我已经检查了,我正在正确的位置使用这个命令。为什么会出现不同的值


3
你有检查过字节序吗? - Fildor
这听起来像是一个字节序问题。 - WBuck
不,这不是一个字节序问题。正如Dmitry所说,我读取的是一个向左移动了1个位置的字节。 - Tode93
2个回答

6

我们来看一下用字节表示的expected

double expected = 0.2051076530529798;

string result = string.Join("-", BitConverter
  .GetBytes(expected)
  .Select(b => b.ToString("X2")));

Console.WriteLine(result);

结果:

66-CC-02-B3-F7-40-CA-3F

让我们与您的输入进行比较

00-67-CC-02-B3-F7-40-CA    // Your input 
   66-CC-02-B3-F7-40-CA-3F // Should be for 0.2051076530529798

看起来你需要跳过1字节(你在错误的位置读取了流)。

// I've assumed that the next byte is `3F`
// Your input without starting `00` but with final `3F`
string data = "67-CC-02-B3-F7-40-CA-3F";

double value = BitConverter.ToDouble(data
    .Split('-')
    .Select(item => Convert.ToByte(item, 16))
    .ToArray(), 
  0);

Console.Write(value);

结果:

 0.20510765305298   

谢谢,这就是问题所在! - Tode93

0

2
请在响应中包含相关信息,以防链接在将来变得无法访问。 - orhtej2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接