2014-12-01 5 views
1

Я создаю буфер, который будет читать/писать в баннере, в котором я могу полностью устранить проблемы, связанные с TCP-сегментацией. Единственная проблема, с которой я столкнулся, это переменная float, все остальное отлично работает, кроме того, для float. Я не могу найти информацию о том, как преобразовать биты int32 в float.Преобразование двоичных бит в плавающие биты

При преобразовании поплавок INT бит, используется следующий метод (Ripped прямо из исходного кода Java, и конвертированы)

private int floatToIntBits(float value) 
{ 
    int result = BitConverter.ToInt32(BitConverter.GetBytes(value), 0); 
    if (((result & 0x7F800000) == 0x7F800000) && (result & 0x80000000) != 0) 
     result = 0x7fc00000; 
    return result; 
} 

Однако, теперь мне нужно сделать обратное, к сожалению, ISN 't любые функции в классе BitConverter, который работает с float.

Я не могу найти много информации в JavaDocs, а не о том, что я могу лично использовать, вы можете найти информацию here.

ответ

3

К сожалению, если вы использовали double и long, есть BitConverter.DoubleToInt64Bits и BitConverter.Int64BitsToDouble. Я действительно не знаю, почему нет Single/Int32 эквивалентов, так как это заставляет вас создать бессмысленный byte[] в куче (он даже не позволяет вам пройти в уже существующий буфер).

Если вы счастливы использовать unsafe код, вы на самом деле можете сделать все это в просто стуком данных, без каких-либо вызовов методов или массивов:

public static unsafe int SingleToInt32Bits(float value) { 
    return *(int*)(&value); 
} 
public static unsafe float Int32BitsToSingle(int value) { 
    return *(float*)(&value); 
} 
+0

К сожалению, поскольку это клиент-api для Unity3D, я не могу использовать небезопасный код, я нашел это решение раньше, и Unity запретила его. Спасибо за ответ, хотя +1 для простого решения. – Hobbyist

+0

@ Christian.tucker да, это раздражает; Я много работаю (я поддерживаю несколько бинарных сериализаторов и других сетевых библиотек), поэтому мне очень больно *, когда «небезопасно» не разрешено –

2

Ключевое слово float является псевдонимом для типа System.Single данных.

Вы можете использовать BitConverter.ToSingle для преобразования четырех байтов в float.

+0

Я никогда не слышал о том, что псевдоним, очень интересно. – Hobbyist

+0

Будет ли это правильное использование? 'byte ch1 = ReadByte(); байт ch2 = ReadByte(); байт ch3 = ReadByte(); байт ch4 = ReadByte(); return BitConverter.ToSingle (новый байт [] {ch1, ch2, ch3, ch4}, 0); ' – Hobbyist

+0

@ Christian.tucker: Да, это выглядит правильно. – Guffa

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