如何将二进制数据转换为浮点值?
how to convert binary data to float value?
对于我的数据记录器项目,我正在将数据记录到 SD 卡中。这里我以二进制格式存储数据。我正在记录加速度计和温度和湿度传感器。我可以逐字节读取数据。因此,为了打印 ADXL 数据(两个字节),我组合了每两个字节的数据。因此必须组合四个字节才能获得温度数据。不幸的是,对于温度,我未能打印实际数据。有一些转换问题。我正在寻找有关如何将数据转换为浮点数的帮助。
读取二进制文件并将其打印到uint16_t(加速度计数据)的代码:工作
while ((nr = fgetc(logFile)) != EOF){
pc.printf(" \r\n %d ",nr);
acc_con[i] = nr;
if (i == 1){
acc = (acc_con[1]<<8) | acc_con[0];
pc.printf(" \r\n %i ",acc);
i = 0;}
else i++;
}
读取二进制并将其打印为浮点数(温度数据)的代码:不起作用
while ((nr = fgetc(logFile)) != EOF){
pc.printf(" \r\n %d ",nr);
humicon[i] = nr;
if (i == 3){
hum = (humicon[0] << 24) | (humicon[1] << 16) | (humicon[2] << 8) | humicon[3];
pc.printf(" \r\n %f ",hum);
i = 0;}
else i++;
}
变量nr逐字节原始数据为:24,58,46,66,变量hum输出为:406466112.000000.
我可以轻松读取湿度或温度(浮点数)。不幸的是,要使用 fread 我必须知道文件中存储的字节数。
使用下面的代码我也可以打印花车。
int main() {
int nr;
FILE *fp = fopen("/sd/PCE000.bin", "rb");
float read[1];
fread(read,sizeof(float),1,fp);
pc.printf("\r\n %f",read[0]);
fclose(fp);
}
我想知道转换公式,例如 (acc_con[1]<<8) | acc_con[0]。谢谢。
如果您想在 Python 中执行此操作,这听起来像是 struct
模块的工作:
>>> struct.unpack("f", "".join([chr(x) for x in [24, 58, 46, 66]]))
(43.556732177734375,)
这假定小端字节顺序。
在 C 中,您可以使用 memcpy()
:
float x;
const unsigned char bytes[] = { 24, 58, 46, 66 };
memcpy(&x, bytes, sizeof x);
printf("%f\n", x);
与
unsigned int hum;
....
hum = (humicon[0] << 24) | (humicon[1] << 16) | (humicon[2] << 8) | humicon[3];
您正在将 8 位数据转换为 32 位整数数据。您可以直接存储此数据。或者如果你绝对想存储在浮动中,你可以使用。
float hum_f;
....
hum_f = hum;
是的,不是简单的函数,将字节数组转换为浮点函数。我也在寻找实施它以避免便携原因。小端和大端机器之间也存在差异。
但是这个问题有几个破解方法。
首先是文件大小,你要包括"sys/stat.h",小差异也是可移植的。但不是必需的。
将其作为 char 的缓冲区读取:
char f[sizeof(float)];
if (fread(f,1,sizeof(float), yourfile) ==sizeof(float))
{
float *flt_ptr=f;
printf("%f\n",*flt_ptr);
}
C 很适合这些东西,也没有必要投任何东西。
对于我的数据记录器项目,我正在将数据记录到 SD 卡中。这里我以二进制格式存储数据。我正在记录加速度计和温度和湿度传感器。我可以逐字节读取数据。因此,为了打印 ADXL 数据(两个字节),我组合了每两个字节的数据。因此必须组合四个字节才能获得温度数据。不幸的是,对于温度,我未能打印实际数据。有一些转换问题。我正在寻找有关如何将数据转换为浮点数的帮助。
读取二进制文件并将其打印到uint16_t(加速度计数据)的代码:工作
while ((nr = fgetc(logFile)) != EOF){
pc.printf(" \r\n %d ",nr);
acc_con[i] = nr;
if (i == 1){
acc = (acc_con[1]<<8) | acc_con[0];
pc.printf(" \r\n %i ",acc);
i = 0;}
else i++;
}
读取二进制并将其打印为浮点数(温度数据)的代码:不起作用
while ((nr = fgetc(logFile)) != EOF){
pc.printf(" \r\n %d ",nr);
humicon[i] = nr;
if (i == 3){
hum = (humicon[0] << 24) | (humicon[1] << 16) | (humicon[2] << 8) | humicon[3];
pc.printf(" \r\n %f ",hum);
i = 0;}
else i++;
}
变量nr逐字节原始数据为:24,58,46,66,变量hum输出为:406466112.000000.
我可以轻松读取湿度或温度(浮点数)。不幸的是,要使用 fread 我必须知道文件中存储的字节数。 使用下面的代码我也可以打印花车。 int main() {
int nr;
FILE *fp = fopen("/sd/PCE000.bin", "rb");
float read[1];
fread(read,sizeof(float),1,fp);
pc.printf("\r\n %f",read[0]);
fclose(fp);
}
我想知道转换公式,例如 (acc_con[1]<<8) | acc_con[0]。谢谢。
如果您想在 Python 中执行此操作,这听起来像是 struct
模块的工作:
>>> struct.unpack("f", "".join([chr(x) for x in [24, 58, 46, 66]]))
(43.556732177734375,)
这假定小端字节顺序。
在 C 中,您可以使用 memcpy()
:
float x;
const unsigned char bytes[] = { 24, 58, 46, 66 };
memcpy(&x, bytes, sizeof x);
printf("%f\n", x);
与
unsigned int hum;
....
hum = (humicon[0] << 24) | (humicon[1] << 16) | (humicon[2] << 8) | humicon[3];
您正在将 8 位数据转换为 32 位整数数据。您可以直接存储此数据。或者如果你绝对想存储在浮动中,你可以使用。
float hum_f;
....
hum_f = hum;
是的,不是简单的函数,将字节数组转换为浮点函数。我也在寻找实施它以避免便携原因。小端和大端机器之间也存在差异。 但是这个问题有几个破解方法。 首先是文件大小,你要包括"sys/stat.h",小差异也是可移植的。但不是必需的。 将其作为 char 的缓冲区读取:
char f[sizeof(float)];
if (fread(f,1,sizeof(float), yourfile) ==sizeof(float))
{
float *flt_ptr=f;
printf("%f\n",*flt_ptr);
}
C 很适合这些东西,也没有必要投任何东西。