将数据从const void *data转换为double类型

Convert data from const void *data to double

本文关键字:转换 double 类型 data 数据 const void      更新时间:2023-10-16

我从其他函数接收到myfunction(const void *data)的数据,其中指针data存储像{0,0,0,0,0,0,0,40,20,0,0,0,0,0,0}这样的值。

我想访问{40,20,0,0,0,0,0,0}的值,并转换为double类型的值,应该给出8.0。对于访问和转换为双精度类型,我尝试了双精度指针:

double* dptr;
dptr=&(*data+8);
dptr;

给出类似

这样的错误

"错误:' const void* '不是指向对象的指针类型"

在C中不能取消对void指针的引用。因此,您可以对void指针进行类型强制转换并使用它。像这样dptr=((double*)data+8);

编辑你的帖子很不清楚。假设data实际上是一个指向双精度数组的指针,解决方案甚至更简单:

double * pd = static_cast<double const *>(data);
double d0 = pd[0];
double d1 = pd[1];

或(C):

double * pd= (double const *)(data);
double d0 = pd[0];
double d1 = pd[1];

不能在void *上执行指针运算和解引用,因此*datadata + 8无效。

我不明白你到底想做什么,但这里是你如何访问数据在你的数组:

假设存储的数据实际上是int,要访问第8个元素并将其转换为double,您应该这样写:

double el = static_cast<double>*(static_cast<int const *>(data) + 8));

更好:

int *p = static_cast<int const *>(data);
double el = static_cast<double>(p[8]);

请注意非常重要data转换为原始指针类型。在我的例子中,我使用int,但你应该用你的数据实际是什么来替换它。

在这一点上,如果你显示的{0,0,0,0,0,0,0,40,20,0,0,0,0,0,0}实际上是字节,那么原始指针类型是char *,你应该转换为char *


进一步说明从指针转换数据:

假设你有一个指向int的指针:

int i  = 24;
int *pi = &i;

如何将地址pi上的数据转换为double ?

// wrong:
double *pd = &i;
cout << *pd << endl;

这是错误的,因为您所做的是转换指针类型而不是实际数据。实际上,您将地址pi上的位模式解释为表示double的位模式。但是那个位模式代表和int

您需要做的是检索数据,因为它是:一个int,然后将int转换为double:

int x = *pi;
double d = (double) x;
#include <stdio.h>
#include <string.h>
double myfunction(const void *data){
    double v;
    memcpy(&v, data, sizeof(v));
    return v;
}
int main (int argc, char *argv[]) {
    unsigned char data[] = {0x40,0x20,0,0,0,0,0,0};
    int i, len = sizeof(data);
    //reverse data If necessary
    for(i=0;i<len/2;++i){
        unsigned char c = data[i];
        data[i] = data[len -1 -i];
        data[len -1 -i] = c;
    }
    double v;
    v = myfunction(data);
    printf("%fn", v);//8.000000
    return 0;
}

您不能在void指针中执行指针算术,因为您不知道内部数据的大小(正如它所说的,它是void)。您必须将其类型转换为具有已知大小的类型。

正确的类型转换和指针算术如下(使用旧的C转换):

char * ptr=(char *)data;
double * myDoublePtr=(double *)(ptr+8);
double myDouble=*myDouble;

或者,如果你有两个连续的双:

double * ptr=(double *)data;
double myDouble=*(ptr+1); //This will access the second double.

这是因为指针运算中的偏移量将执行offset*sizeof(type)字节的跳转,因此在char类型中,跳转的字节数实际上与您的偏移量相同。