如何将char *转换为double *?

时间:2017-08-07 08:15:52

标签: c++ casting

我有一个必须将char指针转换为双指针的函数。最初代码编写为(double *)data,其中数据是char *,但是这导致了cppcheck作为"不兼容的二进制数据表示的警告"并且,从我所读到的,通常不推荐在c ++中使用,因为它更像是一种c风格的方法。

我尝试了static_castdynamic_castreinterpret_cast,但没有一个正常运作。 atof可以转换为double,但我不能将其用于双* - double *vd = &atof(data) - 因为它会抱怨lvalue required as unary ‘&’ operand

以下是我正在使用的示例:

exStateData convertToStateData(char* data, int size) {
    ...
    unsigned int vd_size = *((unsigned int*) data);
    data += sizeof(unsigned int);
    ...
    double *vd = (double*)data;
    return exStateData(vd, vd + vd_size);
}

如何将char *转换为double *?

2 个答案:

答案 0 :(得分:0)

C++中的严格别名规则意味着您无法安全地将指针强制转换为任何类型。唯一可以合法地为其他类型设置别名的类型是charunsigned charstd::byte(C ++ 17)。

出于这个原因,您需要将<{1}}来源中的数据复制到正确对齐的char*(或其他任何类型)。

例如:

double

请注意,标准未指定double get_from_char_array(char const* buffer) { // correctly aligned double double d; // get the address of the double and convert it // to a char pointer because char pointer can alias // any other type char* dp = reinterpret_cast<char*>(&d); // copy the data out of the buffer into the // memory occupied by the double d std::copy(buffer, buffer + sizeof(double), dp); return d; } 的二进制表示,因此以这种方式转换double不一定在平台之间可移植。

答案 1 :(得分:0)

安全的方法是使用memcpy:

exStateData convertToStateData(char* data, int size) {
    ...
    unsigned int vd_size;
    memcpy( &vd_size, data, sizeof(vd_size));
    data += sizeof(vd_size);
    ...
    std::vector<double> vd(vd_size);
    memcpy(&vd[0], data, vd_size*sizeof(double));
    return exStateData(&vd[0], &vd[0] + vd_size); 
}

问题在于这涉及大量复制。但问题是data可能不适合双重对齐。

(执行此操作后,您可能希望更改在最后一行调用的exStateData的重载,以获取对向量的引用 - 它使调用更加清晰。)