将数据从uint8提取到double

时间:2012-10-02 15:15:49

标签: c casting typeconverter unsigned-integer

我有一个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");
    }
}

问题是我没有收到我在外部硬件中发送的内容。我想我的演员是错的。我尝试了其他方法,但没有任何好结果。我仍然无法得到我发送的东西。

3 个答案:

答案 0 :(得分:2)

假设您的数据实际上是一个双精度数组,而size是字节数,那么您的代码应如下所示:

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是字节数而不是double的数量,所以你必须将size除以double的大小才能得到实际的double数:

如果你这样做:

    d = ((double*)&data)[i];

然后你说指向数据的指针是一个双指针。

另外,你的printf语句是这样的:

printf(" d = %d\n");

你告诉它要打印一个int(%d是一个int),而不给它一个实际打印值。我将其更改为%g,以最合适的格式打印双倍。

答案 1 :(得分:1)

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);
  }

 }

是我猜你正在寻找的东西,指针实际上是一个指向双数组的指针,所以你只是把它投射到那个

答案 2 :(得分:0)

如果我理解你的问题(不完全清楚是否最多提取一个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是big-endian或其他方式)。

我还不知道是否适用别名问题。需要再次阅读标准。但是,在实践中从未见过它们。