如何将 double 数据转换为 uint8 数组并再次将 return 转换为 double
how to convert double data to uint8 array and again return to double
我想获取双精度数据,所以之后我将数据作为 uint8_t 数组发送。所以我确定了 2 steps.Steps;
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-第二步:uint8_t 数组加倍
你能在这个阶段提出建议吗?我能怎么做 ?
你能不能在第一阶段检查是否有错误。 ?
谢谢。
这里不需要并集。字符指针在C中比较特殊,可以用来提取任何类型的字节表示。这意味着您当前的 main 可以精简为:
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 浮点数)表示
你只需要一个指针就可以做到这一点。
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;
}
我想获取双精度数据,所以之后我将数据作为 uint8_t 数组发送。所以我确定了 2 steps.Steps;
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-第二步:uint8_t 数组加倍
你能在这个阶段提出建议吗?我能怎么做 ? 你能不能在第一阶段检查是否有错误。 ?
谢谢。
这里不需要并集。字符指针在C中比较特殊,可以用来提取任何类型的字节表示。这意味着您当前的 main 可以精简为:
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.
你只需要一个指针就可以做到这一点。
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;
}