3

我需要一些帮助将 ASCII 字符串转换为单个浮点数。我的数据具有以下格式:

ìÀV3é¾V3»V3AÀV3ÁV3Û¶V3ÅV3=¾V3âºV3ðÂV3߸V3¿V3é¾V3ÁV3Û¶V3é¾V3ìÀV3ÁV3é¾V3ÁV3=¾V3DÂV3DÂV30¶V¿V3:¼V3¿V3ìÀV3,´V3¿V3·V3ì

每四个字符应代表一个浮点数。例如:50.90101e-9;

我正在尝试使用以下 C++ 代码将此字符串转换为可读数据

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>


int main (void)
{
    int i;
    int no_of_bytes;
    char temp_string[2048];
    float this_reading[100];
    char *ptr;
    no_of_bytes=32;

    sprintf(temp_string,"%i",no_of_bytes*4);

    /*convert char string to floating point*/
    sprintf(temp_string,"%i","ìÀV3é¾V3»V3AÀV3ÁV3Û¶V3ÅV3=¾V3âºV3ðÂV3߸V3¿V3é¾V3ÁV3Û¶V3é¾V3ìÀV3ÁV3é¾V3ÁV3=¾V3DÂV3DÂV30¶V¿V3:¼V3¿V3ìÀV3,´V3¿V3·V3ìÀV3");
    ptr=&temp_string [1];
    /*convert char string to floating point*/
    for(i=0; i<no_of_bytes; i++)
    {
        //puts(ptr);
        this_reading [i] = *((float*)ptr);
        ptr = ptr+4;
        printf ("%e \n", this_reading [i]);
    }
}
/*end of main*/

但我得到以下结果:

6.665629e-10 
-6.321715e-30 
4.056162e-02 
-5.629500e+14 
1.259217e-18 
1.779649e-43 
3.087247e+23 
2.350968e-38 
-2.437012e+01 
9.439035e-38 
0.000000e+00 
-2.000000e+00 
-nan 
1.661560e+35 
4.056162e-02 
-5.629500e+14 
1.259217e-18 
1.779649e-43 
3.096102e+23 
2.350968e-38 
-2.437012e+01 
1.628646e+32 
0.000000e+00 
6.490371e+32 
0.000000e+00 
0.000000e+00 
2.596148e+33 
0.000000e+00 
1.038459e+34 
4.153837e+34 
0.000000e+00 
0.000000e+00

我尝试取一个浮点数,接近我要转换的值,将其转换为字符并使用相同的方法返回浮点数,结果中也出现相同的错误:

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>

int main (void)
{

    float reading;
    float number;
    char *ptr;
    float *pointer_number;
    char temp_char ;

    number = 50.90101e-9;
   pointer_number = & number;

    printf ("%e \n",*pointer_number);
    temp_char  = *((char*)pointer_number);

    printf ("%c \n",temp_char);

   ptr=&temp_char ;
    puts(ptr);

    reading  = *((float*)ptr);
    printf ("%f \n", reading);

}
/*end of main*/

.

5.090101e-08 
A 
AA�Z3
22272396874481664.000000 

我不是 C/C++ 数据声明和操作方面的专家。我的最终目的是在 Matlab 中进行这种转换。我正在从一个非常古老的仪器中读取这个值。他们在仪器手册中指定查询数据支持两种使用 IEEE 浮点算术标准(ANSI/IEEE Std. 754-1985)的数据类型。

谢谢!

4

2 回答 2

2

你的问题是temp_string包含垃圾。

sprintf(temp_string,"%i", string_literal)

是错的。 %i与字符指针不兼容,但由于sprintf是 varargs 函数,编译器永远不会知道您有类型不匹配。

输了sprintf,试试

const char* ptr = "...";

然后你的循环应该工作。

或者更简单:

const float *this_reading = (float*)"...";

然后就像使用数组一样使用它。

当然,所有这些代码都假设您的数据的字节顺序与 C++ 平台匹配。但是,如果您对数字运算更感兴趣,它应该“工作得很好”。

于 2013-06-10T14:26:21.803 回答
1

前 10 个值是

0 5.000122e-08
1 4.999939e-08
2 ?
3 5.000061e-08
4 ?
5 4.999206e-08
6 4.985647e-08
7 4.999878e-08
8 4.999573e-08
9 5.000305e-08
...

您在我的 4 字节小端浮点计算机上50.90101e-9转换为的示例。由于类似于第 3、4 个字符(几乎),它暗示您的字符串具有相同的小端浮点格式。将字符串放入 C 文件有 2 个问题。在我的 C 文件中,它将“ìÀV3é¾ ...”字符串转换为 UTF8 编码。通过将它与浮点数结合起来会导致混乱。如前所述,您的字符串肯定缺少一些字节。(我添加了一些以通过 float #2。)我假设真正的字符串在文件中以其原始形式可用。以二进制文件打开文件,并一次读取 4 个字节的文件。A � Z 3CZ 3float

FILE *inf = fopen("Stringfilename", "rb");
int i = 0;
float f;
while (fread(&f, sizeof(f), 1, inf) == 1) {
  printf("%d %e\n", i++, f);
}
fclose(inf);
printf("%d floats read.\n", i);
于 2013-06-10T16:44:51.887 回答