C ++ Как преобразовать вектор <uint8_t> размера 4 в 32-разрядное число с плавающей точкой - PullRequest
0 голосов
/ 29 июня 2018

Какой самый быстрый способ преобразовать вектор размера 4 в 32-разрядное число с плавающей запятой?

Моя неудачная попытка:

static bool vec2float32(std::vector<uint8_t> bytes, float &result)
{
    if(bytes.size() != 4) return false;
    uint8_t sign = (bytes.at(0) & 0x10000000); //will be 1 or 0
    uint8_t exponent = (bytes.at(0) & 0x01111111);
    uint16_t mantissa = (bytes.at(1) << (2*8)) + (bytes.at(2) << (1*8)) + (bytes.at(3) << (0*8));

    result = (2^(exponent - 127)) * mantissa;
    if(sign == 1) result = result * -1;
    return true;
}

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Я считаю, что это должно быть самым быстрым:

return *reinterpret_cast<float*>(&bytes[0]);

Я думаю, что это технически неопределенное поведение. Но большинство компиляторов должны выводить то, что вы ожидаете здесь. & Bytes [0] гарантированно будет работать, потому что std :: vector гарантированно будет смежным.

0 голосов
/ 29 июня 2018

Из вектора вы можете получить указатель на первый байт. Если байты уже в правильном порядке, вы можете скопировать байты непосредственно в переменную float.

...