gpt4 book ai didi

c# - 将 Delphi 扩展转换为 C#

转载 作者:太空狗 更新时间:2023-10-30 00:59:33 29 4
gpt4 key购买 nike

<分区>

如何将 Delphi Extended 类型正确转换为 C# decimal?

我试过这篇文章中的代码 https://stackoverflow.com/a/34550718/2550543 , 对于某些值,它可以正常工作,但不适用于所有值。

示例:

000000000000A08C0B40 == 4500, correct
0050AA7D3A1E33D30140 == 6,59999, correct
00D0F753E3A59BC4F73F == 25769803,776, should be 0.006
00A0703D0AD7A3B0FD3F == 1481763717,12, should be 0.345

是的,两个不正确的值都以 3F 字节结尾,如果这意味着什么......

有人可以帮我吗? :)

到目前为止我使用的代码:

    var extendedSize = 10;
var buf = new byte[extendedSize];

// Populate buffer with something like: { 0x00, 0x68, 0x66, 0x66, 0x66, 0x66, 0x66, 0xA2, 0x02, 0x40 } = 10.15
// Read(buf, extendedSize);

var sign = (buf[extendedSize - 1] & 0x80) == 0x80 ? -1 : 1;
buf[extendedSize - 1] = (byte)(buf[extendedSize - 1] & 0x7F);
var exp = BitConverter.ToUInt16(buf, extendedSize - 2);
var integral = (buf[extendedSize - 3] & 0x80) == 0x80 ? 1 : 0;

// Calculate mantissa
var mantissa = 0.0;
var value = 1.0;
var fractal = BitConverter.ToUInt64(buf, 0);

while (fractal != 0)
{
value = value / 2;
if ((fractal & 0x4000000000000000) == 0x4000000000000000) // Latest bit is sign, just skip it
{
mantissa += value;
}
fractal <<= 1;
}

return sign * (1 << (exp - 16383)) * (integral + mantissa);

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