在 C# 中从二进制值转换为双精度值时出错
Error in conversion from binary value to double in c#
我正在尝试读取由 c++ 程序生成的 二进制文件 。
这个文件有一些 double
数字,当我试图阅读它们时,我得到一个 错误的 double
值。
这是从文件中读取的十六进制值:
00-67-CC-02-B3-F7-40-CA
预期值:
0.2051076530529798
实际值:
-4.9596277989715114E+49
二进制文件类型:double
8字节(c++)
c#中的转换输出:double
(binaryreader.ReadDouble()
)
这是代码:
reader = new BinaryReader(File.Open(path, FileMode.Open), Encoding.Default);
double value = reader.ReadDouble();
我已经检查过了,我在正确的位置使用了这个命令。为什么我有这个不同的值?
对于这种情况,我认为您必须查看编组问题。
C# marshalling (C# call C++ DLL)
https://www.codeproject.com/Questions/1201571/Csharp-marshalling-Csharp-call-Cplusplus-DLL
让我们看一下 expected
表示为 byte
s:
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
看来你应该skip 1
byte(你在错误的地方读取流位置)。
// 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
我正在尝试读取由 c++ 程序生成的 二进制文件 。
这个文件有一些 double
数字,当我试图阅读它们时,我得到一个 错误的 double
值。
这是从文件中读取的十六进制值:
00-67-CC-02-B3-F7-40-CA
预期值:
0.2051076530529798
实际值:
-4.9596277989715114E+49
二进制文件类型:double
8字节(c++)
c#中的转换输出:double
(binaryreader.ReadDouble()
)
这是代码:
reader = new BinaryReader(File.Open(path, FileMode.Open), Encoding.Default);
double value = reader.ReadDouble();
我已经检查过了,我在正确的位置使用了这个命令。为什么我有这个不同的值?
对于这种情况,我认为您必须查看编组问题。
C# marshalling (C# call C++ DLL)
https://www.codeproject.com/Questions/1201571/Csharp-marshalling-Csharp-call-Cplusplus-DLL
让我们看一下 expected
表示为 byte
s:
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
看来你应该skip 1
byte(你在错误的地方读取流位置)。
// 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