作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有以下代码,它以二进制形式将 6 个 float 写入磁盘并读回:
#include <iostream>
#include <cstdio>
int main()
{
int numSegs = 2;
int numVars = 3;
float * data = new float[numSegs * numVars];
for (int i = 0; i < numVars * numSegs; ++i) {
data[i] = i * .23;
std::cout << data[i] << std::endl;
}
FILE * handle = std::fopen("./sandbox.out", "wb");
long elementsWritten =
std::fwrite(data, sizeof(float), numVars*numSegs, handle);
if (elementsWritten != numVars*numSegs){
std::cout << "Error" << std::endl;
}
fclose(handle);
handle = fopen("./sandbox.out", "rb");
float * read = new float[numSegs * numVars];
fseek(handle, 0, SEEK_SET);
fread(read, sizeof(float), numSegs*numVars, handle);
for (int i = 0; i < numVars * numSegs; ++i) {
std::cout << read[i] << std::endl;
}
}
输出:
0
0.23
0.46
0.69
0.92
1.15
0
0.23
0.46
0.69
0.92
1.15
当我在 hexer 中加载文件时,我们得到:
00 00 00 00 1f 85 6b 3e 1f 85 eb 3e d7 a3 30 3f
1f 85 6b 3f 33 33 93 3f -- -- -- -- -- -- -- --
我想直接从小数计算浮点值。例如:1f 85 6b 3e
变为 0.23,1f 85 eb 3e
变为 0.46。
我在网上试过一些“二进制到 float ”的计算器。当我输入数字的十六进制表示时,0x1f856b3e
,在两个计算器中我都得到 5.650511E-20.但我认为该值应该是 0.23,因为我向计算器提供了字节 5-8,这些字节代表写入磁盘的第二个 float 。
我做错了什么?
最佳答案
这是一个 endianness例如,如果您切换问题:
1f 85 6b 3e
到:
3e 6b 85 1f
当您使用您的转换器之一转换它时,这将导致 .23
,例如我使用 IEEE 754 Converter和 Floating Point to Hex Converter允许您进行 double 和单精度转换。
关于c++ - 将二进制值转换为浮点值的计算器——我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22567723/
我是一名优秀的程序员,十分优秀!