Extraia dados de uint8 para dobrar
-
12-12-2019 - |
Pergunta
Eu tenho uma função C recebendo um uint8
ponteiro com outro parâmetro que é o seu tamanho (número de bytes).
eu quero extrair double
dados deste buffer.Aqui está o meu código:
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");
}
}
O problema é que não estou recebendo o que estou enviando dentro de um hardware externo.Acho que meu elenco está errado.Tentei outros métodos, mas sem nenhum bom resultado.Ainda não consigo receber o que envio.
Solução
Se entendi sua pergunta (não está totalmente claro se há no máximo um double
para extrair ou pode haver muitos), eis o que eu tentaria fazer:
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;
}
O que isso evita é um possível problema de alinhamento em um elenco como d = *(double*)data
.
Isto pode falhar de maneiras estranhas e feias se os dados não representarem um valor válido. double
, especificamente se for invertido (por exemploseu hardware é little-endian e a CPU que executa esse código é big-endian ou vice-versa).
Ainda não sei se problemas de alias se aplicam.Precisa ler o padrão novamente.Nunca os vi na prática, no entanto.
Outras dicas
Supondo que seus dados sejam na verdade uma matriz de duplos e o tamanho seja o número de bytes, seu código deve ser parecido com isto:
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);
}
}
Muito provavelmente, o tamanho é o número de bytes e não o número de duplos, então você terá que dividir o tamanho pelo tamanho de um duplo para obter o número real de duplos:
Se você fizer isto:
d = ((double*)&data)[i];
então você está dizendo que o ponteiro para o ponteiro para os dados é um ponteiro duplo.
Além disso, sua declaração printf foi assim:
printf(" d = %d\n");
Você estava dizendo para imprimir um int (%d é um int) e não deu um valor real para imprimir.Mudei para% g, que imprime um duplo no formato de melhor ajuste.
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);
}
}
é o que eu acho que você está procurando, o ponteiro é na verdade um ponteiro para uma matriz de duplos, então você apenas o lança exatamente para isso