Delphi扩展到C#

时间:2010-05-31 12:58:00

标签: c# delphi

如何将浮点10字节十六进制字符串(Delphi中的扩展数据类型)转换为C#数据类型?

例如: 00 00 00 00 00 00 00 80 ff 3f 在德尔福 1

2 个答案:

答案 0 :(得分:2)

涉及相同的问题,分享我的解决方案有人可以发现有用:

        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);    

需要使用NaN和Inf检查来改进代码,并且可能需要将“double”替换为“decimal”。

答案 1 :(得分:1)

好的,这是我的解决方案:

每个字符串在第二个位置包含一个因子字节。在我的例子中,因子是 ff

现在我必须通过Floating-Point Conversion将字符串转换为十进制,并与因子字节相乘以得到结果。

实施例: 3f ff 80 00 00(32bit) - &gt;删除因子字节(ff) - &gt; 3f 80 00 00 - &gt;转换为十进制 - &gt;结果:1 - &gt;乘以因子 - &gt; 1 * 1 - &gt;结果: 1

我希望这很有帮助