将字节转换为二进制,将输出附加到字符串,转换为double,打印输出...输出时丢失位

时间:2012-01-20 21:46:19

标签: c syntax

所以,我遇到了一些代码问题。

我希望这个函数接受一个字节数组(现在用单字节测试),将字节转换为二进制,然后将其附加到“1”。用于计算。

例如:

输出:01110000 ----> 1.01110000

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>

double calcByteValue(uint8_t data[], int size);

int main() {
   uint8_t test[10];
   test[0] = 0x0e;

   double d = calcByteValue(test, 8);
   return 0;
}

double calcByteValue(uint8_t data[], int size) {
    int i;
    uint8_t bits[21];
    char binary[100];
    char str[100] = "1.";

    for (i = 0;i < size;i++) {                    
            bits[i] = (data[0] >> i) & 1;
            if (bits[i] == 0) {
                binary[i] = '0';
                printf("0(%d)\n", i);
            } else {
                binary[i] = '1';
                printf("1(%d)\n", i);
            }
    }

    strcat(str, binary);
    float d = atof(str);
    printf("%f\n", d);
    return 0;
    //return pow(-1, bits[0]) * pow(2, (128-127)) * atof(str));
}

这是我的输出,由于某种原因,它正好经过整个循环,但只打印了6个原始位,敲掉了最后几个。我做错了什么???

0(0)
1(1)
1(2)
1(3)
0(4)
0(5)
0(6)
0(7)
1.011100

2 个答案:

答案 0 :(得分:0)

首先:

strcat(str, binary);

你永远不会终止binary数组。你必须将它用作字符串。

 char binary[100];

binary在块作用域中定义,并且未显式初始化的块作用域自动对象具有不确定的值。

以下是如何null终止数组:

binary[size] = '\0';

第二

您正在以相反的顺序插入位值。将(data[0] >> 7) & 1 binary[0](data[0] >> 6) & 1 binary[1]放在printf等等。

%f printf("%.16f\n", d);转换规范也会在小数点后打印6位数。如果您想要更多数字(例如16),您可以指定如下精度:float

您还使用对象d的{​​{1}}类型,如果您发现float的精度不够,则可以使用double类型。< / p>

答案 1 :(得分:0)

当你将字符串转换为像这样的浮点数时,你总是会失去一些精确度。你几乎不可能精确地将十进制数表示为浮点数。 1.0111000是十进制数,而不是二进制数。