Delphi расширен до C # - PullRequest
       11

Delphi расширен до C #

3 голосов
/ 31 мая 2010

как преобразовать 10-байтовую шестнадцатеричную строку с плавающей запятой (расширенный тип данных в Delphi) в тип данных C #?

Например: 00 00 00 00 00 00 00 80 ff 3f в Delphi 1

Ответы [ 2 ]

2 голосов
/ 31 декабря 2015

Был вовлечен в ту же проблему, поделившись моим решением, кто-то может найти полезным:

        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 * (Math.Pow(2, exp - 16383)) * (integral + mantissa);    

Код должен быть улучшен с помощью проверок NaN и Inf, и, вероятно, «double» необходимо заменить на «decimal».

1 голос
/ 02 июня 2010

Хорошо, вот мое решение:

Каждая строка содержит факторный байт во второй позиции. В моем примере коэффициент равен ff .

Теперь мне нужно преобразовать строку с помощью Преобразования с плавающей точкой в десятичную и умножить на байт фактора, чтобы получить результат.

Пример: 3f ff 80 00 00 (32 бита) -> удалить байт множителя (ff) -> 3f 80 00 00 -> преобразовать в десятичную -> результат: 1 -> умножить на коэффициент -> 1 * 1 -> результат: 1

Надеюсь, это было полезно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...