gpt4 book ai didi

java - 与等效的 Java 代码相比,C# BitConverter 输出错误的 double 值

转载 作者:行者123 更新时间:2023-12-02 10:22:45 36 4
gpt4 key购买 nike

我正在尝试将 Java 函数转换为 C# 函数,但我就是不明白。该函数应该将字节数组转换为 double 型。

假设这两个函数应该做同样的事情,但它们没有。

我尝试过在 C# 中使用 BitConverter,但这只是返回错误的 double 值。

static double readBytes(RandomAccessFile in){ 

byte a, b, c, d, e, f, g, h;

a = in.readByte();
b = in.readByte();
c = in.readByte();
d = in.readByte();
e = in.readByte();
f = in.readByte();
g = in.readByte();
h = in.readByte();
byte[] ba = { h, g, f, e, d, c, b, a };

DataInputStream dis = new DataInputStream(new ByteArrayInputStream(ba));
double x = dis.readDouble();

return x;
}

转换后的 C# 函数:(此函数返回错误的 double 值)

protected internal static double readBytes(FileStream @in)
{
byte a, b, c, d, e, f, g, h;
a = (byte)@in.ReadByte();
b = (byte)@in.ReadByte();
c = (byte)@in.ReadByte();
d = (byte)@in.ReadByte();
e = (byte)@in.ReadByte();
f = (byte)@in.ReadByte();
g = (byte)@in.ReadByte();
h = (byte)@in.ReadByte();
byte[] ba = { h, g, f, e, d, c, b, a };
double doub = BitConverter.ToDouble(ba, 0);
return doub;
}

对于 Java 中的字节数组 = {64, -6, -51, 112, -93, -41, 10, 61} 我得到 double = 109783.04 (这是正确的转换),在 C# 中我得到 1.19203925203128E-14

最佳答案

您需要反转字节的顺序。这与 Little Endian 和 Big Endian 之间的差异有关,即最低有效字节是在前面还是在最后 - 您可以通过谷歌搜索了解更多信息。

Java 以大端存储。如果您的系统采用小端字节序,则需要在转换之前反转字节。 BitConverter 提供了一种确定字节序的方法。例如:

        // assuming we're starting with a big-endian byte[]
// we check if we're using little endian, and if so convert the byte[] to little endian (by reversing its order) before doing the double conversion
byte[] b = new byte[] { 64, 256-6, 256 - 51, 112, 256 - 93, 256 - 41, 10, 61 };
bool little = BitConverter.IsLittleEndian;
if (little)
{
byte[] nb = new byte[b.Length];
for(int i =0; i<b.Length; i++)
{
nb[i] = b[b.Length - 1 - i];
}
double doub = BitConverter.ToDouble(nb, 0);
}
else
{
double doub = BitConverter.ToDouble(b, 0);
}

关于java - 与等效的 Java 代码相比,C# BitConverter 输出错误的 double 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54206671/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com