2013-12-24 2 views
0

Я использую RakNet для работы в сети, и мне нужно передавать значения float. Проблема в том, что я могу отправлять только одиночные байты. Поскольку float состоит из 4 байтов, я думал, что это должно быть возможно, чтобы разорвать поплавок на эти четыре байта и отправить их. После этого я хочу снова собрать их вместе с плавающей точкой.Разделите поплавок на отдельные байты

Как это сделать?

+1

указатели и указатель math ... получают адрес поплавка, а затем начинают сосать байты. –

+0

Будьте осторожны с большим и маленьким концом, а также – clcto

+0

Вы можете сериализовать его: http://stackoverflow.com/questions/1786137/c-serialization-of-the-floating-point-numbers-floats-doubles – Hariprasad

ответ

6
  1. memcpy оригинальный float значение соответствующего размера массива unsigned char с

    float f = ...; 
    
    unsigned char c[sizeof f]; 
    memcpy(c, &f, sizeof f); 
    // use `c[i]` to access the bytes 
    
  2. переинтерпретировать оригинальный указатель как массив unsigned char с использованием reinterpret_cast

    float f = ...; 
    
    unsigned char *c = reinterpret_cast<unsigned char *>(&f); 
    // use `c[i]` to access the bytes 
    
  3. использовать объединение для выполнения той же переинтерпретации

    union FC { 
        float f; 
        unsigned char c[sizeof FC::f]; 
    }; 
    
    float f = ...; 
    
    FC u = { f }; 
    // use `u.c[i]` to access the bytes 
    

Просто имейте в виду несколько дополнительных деталей: последний подход (с union) теперь законно в С, но по-прежнему формально запрещены в C++ - вы не можете читать «неактивные» члены союзов в C++. Соблюдайте порядок байтов на небольших платформах. Если вы используете второй подход, также переинтерпретируйте получателя float как массив unsigned char s, а не наоборот, чтобы избежать проблем с выравниванием.

+0

Я бы не стал используйте функцию memcpy, потому что это очень рискованная функция с точки зрения безопасности. ;) – NKN

+0

@NKN: Ничего опасного в этом нет, если вы знаете, что делаете. «Рискованные» функции - это функции, которые не дают вам возможности предотвратить проблемы (например, 'get' или' atoi', например). 'memcpy' не относится к этой категории. – AnT

+0

Спасибо за ваш ответ. Первый метод звучит как самый простой. Но как вы делаете поплавок снова из этих байтов? –

Смежные вопросы