Преобразовать из массива unsigned char в double - PullRequest
1 голос
/ 22 марта 2012

У меня есть двойное преобразование в массив без знака.Например, для значения 1 массив становится {64, 240, 0, 0, 0, 0, 0, 0}.Теперь я попытался преобразовать массив обратно, используя следующий код, но все, что я получил, это значения для лечения ...

double* pdfOutput = (double*)malloc(sizeof(double));
memcpy(pdfOutput, pInputArray, sizeof(double));

Не могли бы вы сообщить мне, где проблема?Спасибо.

Редактировать : pInputArray создается LabVIEW.По сути, я пытаюсь создать программу, взаимодействующую с LabVIEW VI.Так что я не могу контролировать массив ввода ...

Ответы [ 2 ]

4 голосов
/ 22 марта 2012

Простой способ сделать то, что вы просите - написать:

double pdfOutput = *(double*)pInputArray;

, но это даст те же результаты, что и ваш код.Другими словами, реинтерпретация имеющегося массива char не приводит к ожидаемому двойному значению.Вы должны посмотреть на источник массива char.Код, который создает массив символов, - это то, где я ожидаю, что проблема будет.Чтобы решить вашу проблему, вы должны понимать, что делает код LabVIEW.

1 голос
/ 22 марта 2012

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

Попробуйте эту программу:

#include <stdio.h>

//typedef __int64            int64;  // for Visual Studio
//typedef unsigned __int64   uint64; // for Visual Studio
typedef long long          int64;  // for GCC
typedef unsigned long long uint64; // for GCC

//#define PRId64 "%I64d" // for Visual Studio
//#define PRIu64 "%I64u" // for Visual Studio
#define PRIu64 "%llu"  // for GCC
#define PRId64 "%lld"  // for GCC

union U {
  unsigned char c[8];
  int64  s64;
  uint64 u64;
  double d;
};

void printU( U& u )
{
printf("Raw bytes:  %02x %02x %02x %02x %02x %02x %02x %02x "
        " (%u %u %u %u %u %u %u %u)\n"
        "Interpreted as a    signed 64-bit integer: "PRId64"\n"
        "Interpreted as an unsigned 64-bit integer: "PRIu64"\n"
        "Interpreted as a double (with 'float' precision): %f\n\n",
        u.c[0], u.c[1], u.c[2], u.c[3],
        u.c[4], u.c[5], u.c[6], u.c[7],
        u.c[0], u.c[1], u.c[2], u.c[3],
        u.c[4], u.c[5], u.c[6], u.c[7],
        u.s64, u.u64, (float)u.d);
}

int main()
{
  U u;

  u.c[0]=63;   u.c[1]=240;  u.c[2]=0;   u.c[3]=0;
  u.c[4]=0;    u.c[5]=0;    u.c[6]=0;   u.c[7]=0;
  printU(u);

  u.c[0]=0;    u.c[1]=0;    u.c[2]=0;   u.c[3]=0;
  u.c[4]=0;    u.c[5]=0;    u.c[6]=240; u.c[7]=63;
  printU(u);
}

В моей системе x86 Linux с GCC я получаю следующие результаты:

Raw bytes:  3f f0 00 00 00 00 00 00  (63 240 0 0 0 0 0 0)
Interpreted as a    signed 64-bit integer: 61503
Interpreted as an unsigned 64-bit integer: 61503
Interpreted as a double (with 'float' precision): 0.000000

Raw bytes:  00 00 00 00 00 00 f0 3f  (0 0 0 0 0 0 240 63)
Interpreted as a    signed 64-bit integer: 4607182418800017408
Interpreted as an unsigned 64-bit integer: 4607182418800017408
Interpreted as a double (with 'float' precision): 1.000000

Я подозреваю, что кто-то, работающий с Visual Studio (на x86, конечно), получит те же результаты.Когда я запускаю ту же программу на компьютере с PowerPC Linux (также GCC), я получаю следующие результаты:

Raw bytes:  3f f0 00 00 00 00 00 00  (63 240 0 0 0 0 0 0)
Interpreted as a    signed 64-bit integer: 4607182418800017408
Interpreted as an unsigned 64-bit integer: 4607182418800017408
Interpreted as a double (with 'float' precision): 1.000000

Raw bytes:  00 00 00 00 00 00 f0 3f  (0 0 0 0 0 0 240 63)
Interpreted as a    signed 64-bit integer: 61503
Interpreted as an unsigned 64-bit integer: 61503
Interpreted as a double (with 'float' precision): 0.000000

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

...