Вы можете использовать std::copy
:
float bytesToFloat(uchar b0, uchar b1, uchar b2, uchar b3)
{
uchar byte_array[] = { b3, b2, b1, b0 };
float result;
std::copy(reinterpret_cast<const char*>(&byte_array[0]),
reinterpret_cast<const char*>(&byte_array[4]),
reinterpret_cast<char*>(&result));
return result;
}
Это позволяет избежать взлома объединения, который технически не разрешен языком.Он также избегает обычно используемого reinterpret_cast<float*>(byte_array)
, что нарушает строгие правила псевдонимов (любой объект может интерпретироваться как массив char
, поэтому reinterpret_cast
в этом решении не нарушают строгие правила псевдонимов).
Он по-прежнему полагается на float
шириной в четыре байта и полагается на то, что ваши четыре байта являются действительным числом с плавающей запятой в формате с плавающей запятой вашей реализации, но вы должны либо сделать эти предположения, либо написатьспециальный код обработки для преобразования.