如何将double数据转换为uint8数组,然后再次返回double

时间:2018-07-23 06:25:29

标签: c casting double uint8array

我想以双精度形式获取数据,因此之后我以uint8_t数组形式发送数据。因此,我确定了2个步骤。

第一步-双击uint8_t

#include <stdint.h>
#include <stdio.h>
#include <string.h>
void float2Bytes(double val,uint8_t* bytes_array);

int main(void) {
    double b=1690.000000;
    uint8_t message[1024];
    float2Bytes(b,&message[0]);
    int ii;
    for (ii=0; ii<8; ii++) 
        printf ("byteS %d is %02x\n", ii, message[ii]);
    return 0;
}

void float2Bytes(double val,uint8_t* bytes_array){
    // Create union of shared memory space
    union {
        double double_variable;
        uint8_t temp_array[8];
    } u;
    // Overite bytes of union with float variable
    u.double_variable = val;
    // Assign bytes to input array
    memcpy(bytes_array, u.temp_array, 8);
}

第二步:将uint8_t数组转换为Double

您能在现阶段提出建议吗?我能怎么做 ? 您可以在第一阶段检查是否存在错误。 ?

谢谢。

2 个答案:

答案 0 :(得分:2)

这里不需要工会。字符指针是C语言中的特殊字符,可用于提取任何类型的字节表示形式。这意味着您当前的主电源可以简化为:

int main(void) {
    double b=1690.000000;
    uint8_t* pmessage = (char *) &b;    // legal and portable C
    int ii;
    for (ii=0; ii<sizeof(double); ii++) // portable C
        printf ("byteS %d is %02x\n", ii, message[ii]);
    return 0;
}

第二步,您需要执行memcpy操作才能从字节数组复制到其他类型。同样出于完全相同的原因,这里也不需要联合:可以使用char指针来编写任何类型的字节表示形式:

double doubleFromBytes(uint8_t *buffer) {
    double result;
    // legal and portable C provided buffer contains a valid double representation
    memcpy(&result, buffer, sizeof(double))
    return result;
}

这里唯一的假设是buffer指向包含双精度字节表示形式的字节数组。


当然,您得到的是当前架构的双精度表示。在不同的体系结构(*)上,相同double值的表示形式可以不同。如果打算将表示形式发送到其他计算机或使用不同选项编译的程序,则可能会出现问题。

(*):至少字节序(字节顺序)可以不同。没说sizeof(double)可能与8不同的奇异(没有IEC 60559浮点数)表示形式。

答案 1 :(得分:0)

您只需要一个指针即可。

and createdDatetime >= trunc(sysdate, 'mm')