Разбить двойные символы с помощью указателей? - PullRequest
0 голосов
/ 24 ноября 2011

Могу ли я привести указатель к двойному типу char *, а затем использовать этот указатель для разбиения двойного на байты?

Вот пример кода:

double data;
double *dblPoint = &data;
unsigned char *bytePoint = (unsigned char *)dblPoint;
unsigned char byteArray[sizeof (double)];
unsigned int i;

for(i = 0; i < sizeof(double); i++) {
    byteArray[i] = *(bytePoint + i);
}

byteArray затем передается через UART на другой компьютер и восстанавливается (bytesReceived содержит входящие данные):

unsigned char bytesReceived[sizeof (double)];

double reconstData;
double *newDblPoint;
unsigned int i;

newDblPoint = bytesReceived;
reconstData = *dblPoint;

Итак, после всего этого data == reconstData?

Ответы [ 3 ]

4 голосов
/ 24 ноября 2011

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

1 голос
/ 24 ноября 2011

Ваш первый пример может быть упрощен до:

double data;
unsigned char bytesReceived[sizeof double];
memcpy ( bytesReceived, &data, sizeof data);

Ваш второй пример недопустим: буфер

unsigned char bytesReceived[sizeof double];

не обязательно выровнен по «двойной» границе, поэтомучто приведение

newDblPoint = bytesReceived;
reconstData = *dblPoint;

попытается разыменовать невыровненный указатель.

1 голос
/ 24 ноября 2011

См. 6.2.6.1/4 в C99 Standard .

По сути, он говорит, что копирование любого объекта в массив unsigned char является законным и получает представление объекта .

Если объектное представление типа double одинаково для двух компьютеров, вы получите то же значение на 2-м компьютере, что и то, с которого вы начали на 1-м.

Я бы использовал memcpy вместо цикла

memcpy(byteArray, &data, sizeof data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...