从二进制文件构建一个浮点数c

时间:2015-01-16 14:45:33

标签: c binary

我尝试使用以下格式从二进制文件构建一个浮点数:

  • 前4个字节表示"左侧的数字位数。" 我们称之为X
  • 接下来的4个字节表示"右侧的位数。" 我们称之为Y
  • 下一个字节代表数字符号:" 1" => ' - '," 0" => " +"
  • 下一个X + Y字节代表数字的数字。

示例:

Data.bin:

4 2 0 2 8 3 9 5 3

号码应为:2839.53

我的结构:

typedef struct {
    unsigned int digitsBefore;
    unsigned int digitsAfter;
    char sign;
    char *digits;
} Number;

用于解析和填充结构的函数:

Number *fromBinaryToNumber(FILE *file){
    int counter = 0, size = 0, i = 0;
    size_t bytes_read;

    unsigned int firstIndex, secondIndex;
    char sign;
    char *digits;

    Number *nr = calloc(1, sizeof(Number));

    // reading digits before
    bytes_read = fread(&firstIndex, sizeof(unsigned int), 1, file);
    nr->digitsBefore = firstIndex;

    printf("Bytes read : %zu\n", bytes_read);
    printf("First index %d\n", firstIndex);
    size += firstIndex;

    // reading digits after
    bytes_read = fread(&secondIndex, sizeof(unsigned int), 1, file);
    nr->digitsAfter = secondIndex;

    printf("Bytes read : %zu\n", bytes_read);
    printf("Second index %d\n", secondIndex);
    size += secondIndex;

    // reading sign
    bytes_read = fread(&sign, sizeof(char), 1, file);
    nr->sign = sign;
    printf("Bytes read : %zu\n", bytes_read);
    printf("Sign : %.2X\n", sign);

    //reading digits
    digits = calloc(size, sizeof(unsigned char));
    nr->digits = calloc(size, sizeof(unsigned char));

    printf("Digits : \n");
    bytes_read = fread(digits, size, 1, file);
    for(i = 0 ; i < size; i++){
        printf("%.2X ", digits[i]);
    }

    memcpy(nr->digits, digits, size);
    free(digits);

    return nr;
}

对于Data.bin(Hexdumped)中的以下数据:

04 00 00 00 02 00 00 00 00 02 08 03 09 05 03

我得到了输出:

字节读数:1 第一指数:4 字节读数:1 第二指数:2 字节读数:1 标志:00 数字: 02 08 03 09 05 03

在float中转换Number strunct的函数:

double fromNumbertoDouble(Number *number){
    int size = 0;
    char *buff;

    size = number->digitsAfter + number->digitsBefore + 2;
    buff = calloc(size, sizeof(char));
    if (!buff) {
        fprintf(stderr, "Error calloc in fromNumberToDouble");
        exit(1);
    }

    if (number->sign == '01') {
        strcat(buff, "-");
    }

    strncat(buff, number->digits, number->digitsBefore);
    strcat(buff, ".");
    strncat(buff, number->digits+number->digitsBefore, number->digitsAfter);

    return atof(buff);
}

这总是返回0。

当我查看fromBinaryToNumber返回的号码是什么时,number-&gt; digits =&#34; \ 002 \ b \ 003 \ t \ 005 \ 003&#34;。

我知道atof无法将类似的内容转换为浮动内容。

我的问题是如何将数字&gt;数字转换为可以通过atof转换为浮点数的数字。

关于如何解决这个问题的任何其他想法也将不胜感激。 谢谢你的时间。

2 个答案:

答案 0 :(得分:0)

对于每个数字,添加'0',即数字0的代码点值。这会将数组转换为数字字符序列。当然,对于atof(),它也必须以0结尾,这需要一个合适的字符串。

你确实意识到你的格式非常尴尬,对吧?单个float将始终使用4个字节作为整个数字。如果您仍然要转换为float,那么您将无法保持格式支持的任意精度。

答案 1 :(得分:0)

首先你的缓冲区大小是错误的 - 你没有考虑小数点,符号或零终结符。此外,您不会初始化buff - 因此strcat可以在任何地方连接 - 您应该calloc之前memsetbuff之前strcat更新{{1}}& #39;任何事情。