在c ++中将unsigned char数组转换为float数组的最佳方法是什么?
我现在有一个for循环如下
for (i=0 ;i< len; i++)
float_buff[i]= (float) char_buff[i];
我还需要反转过程,即从unsigned char转换为float(float到8bit转换)
for (i=0 ;i< len; i++)
char_buff[i]= (unsigned char) float_buff[i];
任何建议都将不胜感激
由于
答案 0 :(得分:9)
我认为最好的方法是使用函数对象:
template <typename T> // T models Any
struct static_cast_func
{
template <typename T1> // T1 models type statically convertible to T
T operator()(const T1& x) const { return static_cast<T>(x); }
};
接下来是:
std::transform(char_buff, char_buff + len, float_buff, static_cast_func<float>());
std::transform(float_buff, float_buff + len, char_buff, static_cast_func<unsigned char>());
这是最具可读性的,因为它说的是用英语完成的工作:使用静态转换将序列转换为不同的类型。未来的演员表可以在一行中完成。
答案 1 :(得分:8)
您的解决方案几乎是最佳选择,但是,我会考虑切换到:
char_buff[i]= static_cast<unsigned char>(float_buff[i]);
答案 2 :(得分:2)
您的解决方案似乎是正确的,但在回来的路上,您可能会丢失投射中的浮动数字。
答案 3 :(得分:2)
你出于什么目的这样做?将一个浮子推入一个char并没有多大意义。在大多数平台上,float将是4个字节并表示浮点数,其中char将是1个字节并且通常表示单个字符。你将失去3个字节的数据试图将一个浮点数推入一个char,对吗?
答案 4 :(得分:2)
你的第一个循环不需要演员。您可以隐式地将一种类型(例如unsigned char
)转换为更宽的类型(例如float
)。您的第二个循环应使用static_cast
:
for (i=0; i< len; i++)
char_buff[i]= static_cast<unsigned char>(float_buff[i]);
我们使用static_cast
明确告诉编译器转换为更窄的类型。如果您不使用强制转换,您的编译器可能会警告您转换可能会丢失数据。存在运行操作符意味着您了解您可能会丢失数据精度并且您可以使用它。 不这是使用reinterpret_cast
的合适位置。使用static_cast
,您至少可以对可以执行的转换进行一些限制(例如,它可能不允许您将Bird*
转换为Nuclear_Submarine*
)。 reinterpret_cast
没有此类限制。
此外,这是Bjarne Stroustrup对此主题的评论。
答案 5 :(得分:1)
演员表是自动的,因此您无需明确说明 但您可以使用标准算法:
std::copy(char_buff,char_buff+len,float_buff);
从float转换回char可能会丢失信息。所以你需要更明确。
std::transform(float_buff,float_buff+len,char_buff,MyTransform());
这里我们使用MyTransform类,它应该有一个operator(),它接受一个float并返回一个char。这应该是无足轻重的。
答案 6 :(得分:0)
如果您正在处理非常大的阵列并且性能至关重要,那么以下可能会更有效:
float *dst = float_buff;
unsigned char *src = char_buff;
for (i=0; i<len; i++) *dst++ = (float)*src++;
答案 7 :(得分:0)
没有人提到这一点,但如果你正在使用浮点运算,你可能想要舍入而不是截断...如果你有char 49,它会变成4.9E1,经过一些算术运算后,它可能变成4.89999999E1,当你把它变成一个字符时会变成48。
如果你没有对浮动做任何事情,这应该不是问题,但那你为什么首先需要它作为浮动?