【发布时间】: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 转换为浮点数的东西。
对于如何解决此问题的任何其他想法也将不胜感激。 感谢您的宝贵时间。
【问题讨论】: