-6ren">
gpt4 book ai didi

c - 从二进制文件 c 构建一个 float

转载 作者:太空宇宙 更新时间:2023-11-04 04:39:22 24 4
gpt4 key购买 nike

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

  • 前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

将 Number strunct 转换为 float 的函数:

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。

当我检查从 BinaryToNumber 返回的数字中的内容时,number->digits = "\002\b\003\t\005\003"。

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

我的问题是如何将 number->digits 转换成可以被 atof 转换成 float 的东西。

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

最佳答案

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

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

关于c - 从二进制文件 c 构建一个 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27986474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com