Столкнулся с проблемой, что QUIK использует формат XLTable для передачи данных по DDE.

Данные идут в виде строк или чисел с плавающей запятой - вот с последними основная проблема.
Дело в том, что из пакета данных можно достать массив типа byte (c++), в котором 8 байт отведены под ЧПЗ двойной точности.
Эти 8 байт есть IEEE-754 представление ЧПЗ двойной точности (подробно тут, а тут калькулятор).

Основная проблема, как преобразовать массив байт в число типа double.
Пришлось делать все по битам (здесь красивые картинки) - принимаю комменты по коду, т.к. особо я его не оптимизировал - работает и ладно, пошел дальше.

    //Проверка : 8 байт из посылки DDE: 0x9a99999999a09a40
    //Есть десятичное 1704.15, моя функция дает 1704.1500000000001

    //Массив байт
    byte* data = new byte[8];
   
    data[0] = 0x9a;
    data[1] = 0x99;
    data[2] = 0x99;
    data[3] = 0x99;
    data[4] = 0x99;
    data[5] = 0xa0;
    data[6] = 0x9a;
    data[7] = 0x40;

    //Буфер для перестановки байт
    //Переставляем байты в обратном порядке
    byte buf;
    buf = data[0];
    data[0] = data[7];
    data[7] = buf;
    buf = data[1];
    data[1] = data[6];
    data[6] = buf;
    buf = data[2];
    data[2] = data[5];
    data[5] = buf;
    buf = data[3];
    data[3] = data[4];
    data[4] = buf;

    //Далее представляем 8 байт как сплошные 64 бита для простоты. 63 бит слева, 0 бит справа.
    //63 бит - знак числа
    //если 0 - число положительное, 1 - отрицательное
    int sign = (data[0] & 0x80) >> 7;
    //биты с 62 по 52 - показатель степени, из расшифрованного числа нужно отнять 1023
    int exponent = (int)(((data[0] & 0x7f) << 4) + ((data[1] & 0xf0) >> 4)) - 1023;
    //2, возведенная в нужную степень
    double stepen2 = (int)pow(2.0,exponent);
    //Заранее считаю множитель дробной части, чтобы сократить погрешность
    double footer = stepen2 / 4503599627370496;
    //биты с 51 по 0 - мантисса
   
    //Формула расчета:
    //(-1)^sign * 2^(exponent - 1023) * (1 + mantisse/2^52)
   
    //далее я последнюю скобку умножил на 2^(exponent - 1023),
    //чтобы не пришлось делить на 2^52, а меньше.
    double mantisse =  stepen2  + (
        //51 -48
        ((double)(data[1] & 0x0f) * (double)281474976710656) +
        ((double)data[2] * (double)1099511627776) +
        ((double)data[3] * (double)4294967296) +
        ((double)data[4] * (double)16777216) +
        ((double)data[5] * (double)65536) +
        ((double)data[6] * (double)256) +
        ((double)data[7] )) * footer;

    //Итоговое значение со знаком
    double value = (sign == 0 ? 1 : -1) * mantisse;
























































Вам это будет интересно!

  • Для себя и потомков. Чтобы не забыть.
  • Чтобы не забыть…
  • Что бы такое съесть, чтобы похудеть?
  • пост от 09.01.08.
  • ГЛАВНОЕ НЕ ЗАБЫТЬ


  • Последние новости


    Конструкции стен из кирпича

    Стены, выложенные из кирпича, по сравнению с деревянными характеризуются значительно большей прочностью и устойчивостью. Помимо этого, в число их достоинств входят долговечность и способность сохранять первоначальные качества при длительном воздействии неблагоприятных внешних физико климатических факторов. Для сооружения жилых построек современная стро...
    Читать далее »

    Ограждающие конструкции - современные решения

    Для того чтобы правильно подобрать способ теплоизоляции жилой постройки и вид утеплителя, важно знать основные характеристики конструкционных элементов, составляющих здание, и материалов, используемых для их выполнения. Чтобы получить жилище, которое будет отвечать всем требованиям комфорта и безопасности, при проектировании особое внимание следует уделять ...
    Читать далее »

    Пробковые утеплители

    Одним из высокоэффективных современных утепляющих материалов считаются плиты, изготовленные из измельченной коры пробкового дуба. Среди их главных достоинств следует назвать небольшой вес, твердость, прочность и устойчивость к гниению и образованию плесени при воздействии влаги. Пробковые теплоизолирующие материалы не повреждаются грызунами и не разрушаются...
    Читать далее »

    Выполнение теплоизоляции пола и перекрытий

    Помимо повышения теплотехнических качеств стен, окон и кровли, для создания благоприятных микроклиматических условий в доме необходимо утеплять пол и потолочные перекрытия. Пол можно считать особой конструкцией в жилой постройке, поскольку человек пребывает почти в постоянном контакте с ним. Именно поэтому важно выбрать такую конструкцию и вид теплоизоляции, ...
    Читать далее »

    Приложение

    Утепление окна стекловолокном – обязательное условие, при котором значительно снизятся теплопотери. Теплоизоляция кирпичного дома плитами пенополистирола – надежный способ сделать жилище теплым и комфортным. Как сделать это правильно, показано на рис. 50. ...
    Читать далее »

    Пенополистирольные утеплители

    В последнее время на строительном рынке особенно высоким спросом пользуется теплоизолирующий материал URSA XPS. Его выпускают в форме жестких плит, размер которых составляет 1,25 × 0,6 м. Сырьем для производства данного материала является экструдированный пенополистирол, обладающий структурой с закрытыми ячейками. URSA XPS – это утеплитель, главными свойствами которого являются устойчивость к воздействию влаги и высока...
    Читать далее »

    Теплоизоляция - важная составляющая архитектуры здания

    О доме, отличающемся от других построек изысканной и оригинальной архитектурой, мечтает каждый. Сегодня реализовать это желание несложно: достаточно всего лишь подготовить смелый проект и необходимые строительные материалы. Современные загородные мини городки удивляют своими необычными строениями с характерными для них сложной конфигурацией, резкой разницей высоты составляющих частей, французскими окнами и т. ...
    Читать далее »