2017-01-30 10 views
1

Мне нужно преобразовать массив байтов в массив поплавков. Я получаю байты через сетевое соединение, а затем должен разбирать их в поплавках. размер массива не является предварительно деконфигурированным. это код, который я имею до сих пор, используя союзы. Есть ли у вас какие-либо предложения о том, как заставить его работать быстрее?Самый быстрый способ конвертировать 4 байта в float в C++

int offset = DATA_OFFSET - 1; 
UStuff bb; 
//Convert every 4 bytes to float using a union 
for (int i = 0; i < NUM_OF_POINTS;i++){ 
    //Going backwards - due to endianness 
    for (int j = offset + BYTE_FLOAT*i + BYTE_FLOAT ; j > offset + BYTE_FLOAT*i; --j) 
    { 
     bb.c[(offset + BYTE_FLOAT*i + BYTE_FLOAT)- j] = sample[j]; 
    } 
    res.append(bb.f); 
} 
return res; 

Это объединение я использую

union UStuff 
{ 
     float f; 
     unsigned char c[4]; 
}; 
+0

_ «Я получаю байты через сетевое соединение, а затем должен разбирать их в поплавках». _ Вы должны лучше определить «плавающие», если они поступают с другого компьютера. –

+0

_ «Есть ли у вас предложения о том, как заставить его работать быстрее?» _ SO не является сервисом оптимизации! –

+1

Определите «конвертировать». Существует много возможных отображений. Вы использовали слово «parse», но ваша программа не сгруппировала сеанс. –

ответ

5

Технически вы не можете набрать-каламбур через union в C++, хотя вам разрешено сделать это в C. Поведение вашего кода не определено.

Отметив эту важную точку поведения: даже тогда вы предполагаете, что float представлен на всех машинах таким же образом, чего нет. Вы могли бы думаю, a float - это 32-разрядный блок данных IEEE754, но он не имеет.

К сожалению, лучшее решение будет в конечном итоге slower. Большинство сериализаций данных с плавающей запятой выполняются путем ввода и вывода из строки, которая в вашем случае в значительной степени решает проблему, поскольку вы можете представить их как массив данных unsigned char. Таким образом, ваш единственный аргумент сводится к вычислению данных данных. Работа выполнена!

+0

IMHO, любой компилятор C++, который бы не выполнял функции пуна в рамках работы объединения, как ожидалось, нарушен. Независимо от того, что говорит стандарт. –

+0

@ ErikAlapää: Я был бы склонен согласиться с вами, особенно если один из членов профсоюза является массивом 'unsigned char'. – Bathsheba

+0

Интересной альтернативой является использование атрибутов компилятора, таких как gcc: s may_alias. May_alias - это своего рода инверсии «ключевое слово strict», используемое для того, чтобы сказать, что массивы не перекрываются, поэтому may_alias будет еще более полезен, если стандартизован. Тогда C и C++ могут быть еще более похожими на «портативный ассемблер», который они используют. –