我尝试使用以下格式从二进制文件构建一个浮点数:
示例:
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转换为浮点数的数字。
关于如何解决这个问题的任何其他想法也将不胜感激。 谢谢你的时间。
答案 0 :(得分:0)
对于每个数字,添加'0'
,即数字0的代码点值。这会将数组转换为数字字符序列。当然,对于atof()
,它也必须以0结尾,这需要一个合适的字符串。
你确实意识到你的格式非常尴尬,对吧?单个float
将始终使用4个字节作为整个数字。如果您仍然要转换为float
,那么您将无法保持格式支持的任意精度。
答案 1 :(得分:0)
首先你的缓冲区大小是错误的 - 你没有考虑小数点,符号或零终结符。此外,您不会初始化buff - 因此strcat
可以在任何地方连接 - 您应该calloc
之前memset
或buff
之前strcat
更新{{1}}& #39;任何事情。