1

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

1-第一步:加倍到 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);
}

2-Second Step : uint8_t 数组到 Double

你能在这个阶段提供建议吗?我能怎么做 ?你能在第一阶段检查是否有错误。?

谢谢你。

4

2 回答 2

3

联合在这里是不必要的。字符指针在 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指向一个包含双精度字节表示的字节数组。


当然,你在这里得到的是当前架构的双精度表示。在不同的架构(*)上,相同双精度值的表示可能不同。如果打算将表示发送到不同的机器或使用不同选项编译的程序,这可能是一个问题。

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

于 2018-07-23T07:52:22.820 回答
0

您只需要一个指针来执行此操作。

int main(void)
{
    double b=1690.000000;
    // double to uint8 array
    uint8_t* pmessage = (uint8_t*) &b;
    int ii;
    for (ii=0; ii<sizeof(double); ii++)
        printf ("byteS %d is %02x\n", ii, message[ii]);

    // uint8 array to ddouble
    double c = *((double *)pmessage);
    printf ("double %f\n", c);

    return 0;
}
于 2018-07-23T07:58:10.183 回答