C++ 如何将字符数组转换为浮点数组?

C++ 如何将字符数组转换为浮点数组?,c++,types,casting,type-conversion,C++,Types,Casting,Type Conversion,为了训练分类器,需要使用一组浮点数组指定训练数据。不幸的是,我可用的训练数据是字节数组(实际上它们是数组,可以转换为无符号字符数组) 本质上,给定一个无符号字符数组,我需要将其转换为浮点数组:换句话说,给定一个无符号字符数组,我应该将其读取为浮点数组。总是允许这种操作吗?浮点数据类型是否允许所有可能的位配置?如果是,如何实现此转换?您应该显式执行每个操作,而不是依赖隐式转换。第一次读取字符形式的数组 unsigned char charArray[100]; // reading 然后通过o

为了训练分类器,需要使用一组浮点数组指定训练数据。不幸的是,我可用的训练数据是字节数组(实际上它们是数组,可以转换为无符号字符数组)


本质上,给定一个无符号字符数组,我需要将其转换为浮点数组:换句话说,给定一个无符号字符数组,我应该将其读取为浮点数组。总是允许这种操作吗?浮点数据类型是否允许所有可能的位配置?如果是,如何实现此转换?

您应该显式执行每个操作,而不是依赖隐式转换。第一次读取字符形式的数组

unsigned char charArray[100];
// reading 
然后通过obe逐个转换元素

float floatArray[100];
for(i=0; i<100; ++i) {
   floatArray[i] = (float) charArray[i];
}
浮点数组[100];

对于(i=0;i您可以使用for循环运行迭代转换。然后您可以使用float数组。不过,我确信有一个单行解决方案。

鉴于的文档,函数:

IppStatus ippsConvert_8u32f(const Ipp8u* pSrc, Ipp32f* pDst, int len);

这似乎是一个最方便的函数,可以准确地完成你要查找的内容。

近似实数的方法有很多种。有浮点表示法,其中一些位表示指数,一些位表示系数;有定点表示法,其中一些位表示整体数字部分和一些位代表派系部分,存在任意有限精度表示,其中存储了一些基数中的一些“数字”,等等,对于每个一般的表示类,都有无限多样的细节,在将该表示转换为
float
s时,这些细节很重要

您的问题没有指定字节数组包含的表示形式。指定数组为
Ipp8u
与提供必要的信息相差甚远


您可能的意思是,字节数组包含机器的本机表示形式
float
s(可能是IEEE-754)的字节表示形式,其endianess最多不同

您只需将
char
数组中的数据memcpy放入一个浮点数组:

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\u cast(c);
此强制转换可能具有未定义的行为,因为
float
可能比
char
具有更严格的对齐要求

如果endianess不同,则首先遍历字节数组并对字节重新排序,如下所示:

// 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));
}
//假设sizeof(float)=sizeof(uint32\t)

对于(int i;iI)将使用stringstream库,请澄清:数据是二进制的(并以正确的字节顺序等),还是人类可读的字符串?@enzom83:“二进制”不表示任何内容-它是什么类型的二进制格式?它是平台的
float
s数组的二进制表示形式还是其他形式?仍然不确定:如果每个无符号字符表示一个值,则@Dims的答案有效。如果每4个字节都是二进制float表示形式,则事情会变得有点复杂。@enzom83如果不必这样做的话转换每个元素,你要做什么?你没告诉我们什么?是的,你甚至不需要
(float)除非你把你的警告级别提高到不现实的高度……是的,但是这有利于声明的明确性。我不必转换原始数组的每个元素,而是整个数组。但是这里的人不喜欢C++中的那种类型化;他们声称它属于C,而应该使用C++特定的类型。在C++中,听起来就像我所需要的!现在我想知道<代码> IPP32 F类型是否可以转换成<代码>浮点< /代码>类型。@ ZEnOM83-很难说。如果英特尔将此作为直接转换,或者不能直接分配到平台依赖的代码>浮标< /代码>的SDK类型的<代码> IPP3f,那将是在我看来,这是转换从
Ipp32f
float(s)转换而来的
Ipp8u
字节流的唯一有文档记录的方法回到同样的话题。很有可能从他们的
Ipp32f
直接转换成系统-
float
会起作用,但你应该认真查阅有关它的支持文档。我刚刚读了关于的第四篇文章:
Ipp32f
float
@enzom83如果这是一个来自英特尔的可行的源代码,那么你很可能会明白。您仍然需要将其转换为
Ipp32f
值,然后将结果分配给数组中的system-
float
。不要直接传递数组偏移量,因为它们的函数要求其类型。您永远不知道。我将继续寻找与平台无关的更具体证据(也就是说,英特尔说你可以根据链接“blah”自由交换
Ipp32f
float
,但它看起来确实很有希望。