c++ - 如何将 char 数组转换为 float 数组?

标签 c++ types casting type-conversion

为了训练分类器,需要使用一组 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/

相关文章:

c++ - 在处理程序中排队请求时,从多个线程或一个线程调用boost asio io_service.run

c++ - QSerialPort 在应用程序启动之前正在使用

c - int to time_t* 打印类型

c++ - reinterpret_cast 在二进制方面做了什么?

c++ - 将 string 类型转换为 unsigned int 时出现故障

c++ - 从 GetAdaptersAddresses() 获取子网掩码

c++ - 不能在字符串中嵌入非 ASCII

haskell - 模式匹配数据类型及其在 Haskell 中的嵌套名称

haskell - 为什么有一个单独的类型模块?

Haskell 类型和签名