Извлечь данные из uint8 в double
-
12-12-2019 - |
Вопрос
У меня есть функция C, получающая uint8
указатель с другим параметром — его размером (количество байтов).
Я хочу извлечь double
данные из этого буфера.Вот мой код:
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
double d;
for (i = 0; i < size; i++)
{
d = ((double*)&data)[i];
printf(" d = %d\n");
}
}
Проблема в том, что я не получаю то, что отправляю, на внешнем оборудовании.Я думаю, что мой актерский состав неправильный.Я пробовал другие методы, но без какого-либо хорошего результата.Я до сих пор не могу получить то, что отправляю.
Решение
Если я понимаю ваш вопрос (не совсем понятно, есть ли хотя бы один double
извлечь или их может быть много), вот что я бы попробовал сделать:
double Write(uint8* data, uint8 size)
{
double d;
if (size < sizeof(d))
return 0; // failure; you may want something smarter than this
memcpy(&d, data, sizeof(d));
return d;
}
Чего это позволяет избежать, так это потенциальной проблемы с выравниванием в таком приведении, как d = *(double*)data
.
Это может потерпеть неудачу странным и уродливым образом, если данные не представляют собой действительные данные. double
, особенно если оно перевернуто (например.ваше оборудование имеет прямой порядок байтов, а процессор, на котором выполняется этот код, имеет обратный порядок байтов или наоборот).
Я еще не знаю, применимы ли проблемы с псевдонимами.Нужно еще раз прочитать стандарт.Хотя на практике их не видел.
Другие советы
Предполагая, что ваши данные на самом деле представляют собой массив чисел типа double, а размер — это количество байтов, ваш код должен выглядеть примерно так:
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
double d;
int i;
for (i=0; i<size/sizeof(double); ++i) {
d = ((double*)data)[i];
printf(" d = %g\n",d);
}
}
Скорее всего, размер — это количество байтов, а не количество двойных значений, поэтому вам придется разделить размер на размер двойного значения, чтобы получить фактическое количество двойных значений:
Если вы сделаете это:
d = ((double*)&data)[i];
тогда вы говорите, что указатель на указатель на данные является двойным указателем.
Кроме того, ваш оператор printf был таким:
printf(" d = %d\n");
Вы сказали ему напечатать целое число (%d — это целое число), но не указали фактическое значение для печати.Я изменил его на %g, который печатает двойное значение в наиболее подходящем формате.
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
double d;
for (i=0; i<size; i++) {
d = ((double*)data)[i];
printf(" d = %d\n", d);
}
}
это то, что, я думаю, вы ищете, указатель на самом деле является указателем на массив двойных значений, поэтому вы просто приводите его именно к этому