【问题标题】:Building a float from binary files c从二进制文件 c 构建一个浮点数
【发布时间】:2015-01-16 22:55:33
【问题描述】:

我正在尝试从具有以下格式的二进制文件构建一个浮点数:

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

例子:

数据.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

浮点数转换函数:

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->digits = "\002\b\003\t\005\003"。

我知道 atof 不能将类似的东西转换成浮点数。

我的问题是如何将数字->数字转换为可以通过 atof 转换为浮点数的东西。

对于如何解决此问题的任何其他想法也将不胜感激。 感谢您的宝贵时间。

【问题讨论】:

    标签: c binary


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      首先,您的缓冲区大小错误 - 您没有考虑小数点、符号或零终止符。此外,您不初始化 buff - 所以 strcat 可以在任何地方连接 - 您应该在 strcat 之前将 callocmemset buff 设置为 0@'ing 任何东西。

      【讨论】:

      • 编辑了大小并调用了 buff。谢谢你。
      • 不完全 - calloc 被定义为 calloc(num, size_of_elements)
      猜你喜欢
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多