- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
为了训练分类器,需要使用一组 float 组指定训练数据。不幸的是,我可用的训练数据是字节数组(实际上它们是 Ipp8u 数组,可以转换为 unsigned char 数组)。
本质上,给定一个 unsigned char 数组,我需要将其转换为 float 数组:换句话说,给定一个 unsigned char 数组,我应该将其读取为 float 数组。是否始终允许此操作? float 数据类型是否允许所有可能的位配置?如果是,如何实现这个转换?
最佳答案
有很多方法可以逼近实数。有浮点表示,其中一些位表示指数,其他一些位表示系数,有定点表示,其中一些位表示整数部分,一些位表示小数部分,还有任意有限精度表示,其中一些数字某些基数中的“数字”被存储等,并且对于每个一般的表示类,在将该表示转换为 float
时,这些细节会很重要。
您的问题没有指定字节数组包含什么表示形式。指定数组为 Ipp8u
没有提供必要的信息。
您的意思可能是字节数组包含机器对 float
的 native 表示的字节表示。 s(可能是 IEEE-754),最多在字节顺序上有所不同。
您可以简单地对 char
中的数据进行 memcpy数组转换为 float 数组:
char c[10 * sizeof(float)] = {...};
float f[10];
std::memcpy(f, c, 10 * sizeof(float)); // or you can search for an implementation of bit_cast
不要做的一件事就是简单地转换 char
数组:float *f = reinterpret_cast<float*>(c);
此转换可能具有未定义的行为,因为 float
对齐要求可能比 char
更严格.
如果字节顺序不同,那么您首先遍历字节数组并对字节重新排序,如下所示:
// assuming sizeof(float) == sizeof(uint32_t)
for (int i; i<sizeof c; i+=sizeof(float)) {
uint32_t i;
std::memcpy(&i, c + i, sizeof(uint32_t));
ntoh(i); // swaps bytes from Network TO Host order.
std::memcpy(c + i, &i, sizeof(uint32_t));
}
关于c++ - 如何将 char 数组转换为 float 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14187318/
我是一名优秀的程序员,十分优秀!