从 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
, ,特别是如果它被颠倒了(例如您的硬件是小端字节序,而运行此代码的 CPU 是大端字节序,或者反之亦然)。
我还不知道是否存在别名问题。需要再读一遍标准。但从未在实践中见过它们。
其他提示
假设您的数据实际上是一个双精度数组,大小是字节数,您的代码应如下所示:
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);
}
}
最有可能的是, size 是字节数而不是双精度数的数量,因此您必须将 size 除以双精度数的大小才能获得实际的双精度数:
如果你这样做:
d = ((double*)&data)[i];
那么你是说指向数据的指针是双指针。
另外,你的 printf 语句是这样的:
printf(" d = %d\n");
您告诉它打印一个 int (%d 是一个 int),而不是给它一个要打印的实际值。我将其更改为 %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);
}
}
我猜你正在寻找什么,该指针实际上是一个指向双精度数组的指针,因此你只需将其强制转换为该指针即可
不隶属于 StackOverflow