Конвертировать между двойным и байтовым массивом, для передачи через ZigBee API? - PullRequest
6 голосов
/ 09 ноября 2011

Я пытаюсь взять две двойные точки (координаты GPS) и отправить их через API ZigBee на другой приемный блок ZigBee, но я не знаю, как разложить двойные числа в байтовые массивы, а затем пересобрать их обратно вих первоначальная форма после передачи.

По сути, мне нужно превратить каждый дубль в массив из восьми необработанных байтов, затем взять эти необработанные данные и снова восстановить дубль.

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 09 ноября 2011

То, что вы делаете, называется тип наказания .

Используйте союз:

union {
  double d[2];
  char b[sizeof(double) * 2];
};

Или используйте reinterpret_cast:

char* b = reinterpret_cast<char*>(d);
4 голосов
/ 09 ноября 2011

Вот довольно небезопасный способ сделать это:

double d = 0.123;
char *byteArray = (char*)&d;

// we now have our 8 bytes

double final = *((double*)byteArray);
std::cout << final; // or whatever

Или вы можете использовать reinterpret_cast:

double d = 0.123;
char* byteArray = reinterpret_cast<char*>(&d);

// we now have our 8 bytes

double final = *reinterpret_cast<double*>(byteArray);
std::cout << final; // or whatever
1 голос
/ 09 ноября 2011

Обычно double - это уже восемь байтов. Пожалуйста, проверьте это в вашей операционной системе, сравнив sizeof (double) и sizeof (char). C ++ не объявляет байт , обычно это означает char

Если это действительно так.

   double x[2] = { 1.0 , 2.0};

   double* pToDouble = &x[0];
   char* bytes = reinterpret_cast<char*>(pToDouble);

Теперь байты - это то, что вам нужно отправить ZigBee

...