2017-02-23 43 views
1

Учитывая следующую переменную:Преобразование поплавок в шестнадцатеричном формате

float myFloat = 0xC0451EB8; 

Как получить C0451EB8 от myFloat?

Редактировать: Не знаю, почему я проголосовал здесь без комментариев. Я не прошу простого шестнадцатеричного представления float или uint32. Я могу сделать это. Учитывая определение переменной выше и [возможный общий] ответ:

string FloatAsHex(float myFloat) { 
    return BitConverter.ToString(BitConverter.GetBytes(myFloat)); 
} 

FloatToHex(0xC0451EB8); //will output 1F-45-40-4F, not what I expect 
FloatToHex(BitConverter.ToSingle(BitConverter.GetBytes(0xC0451EB8))) //works 

Хотя второй один, очевидно, работает, я только иметь доступ к переменной с плавающей точкой.

+0

Вы имеете в виду asa string? –

+0

Да, как строка или байт [] - Я просто хотел бы обратить вспять преобразование. – nullable

+1

Вы можете попробовать использовать '.ToString (" x ")', но для этого, вероятно, потребуется выполнить литье в double или int –

ответ

1

Там нет никакого способа, чтобы сделать то, что вы просите. Ваш код хранит целочисленное значение 0xC0451EB8 или в десятичном значении 3225755320, в переменной типа float. Целочисленное значение имеет 32 бита точности, но float не может представлять 32 бита числовой точности, потому что некоторые из 32 бит значения float передаются экспоненте.

Таким образом, целочисленное значение 3225755320 усекается до 3225755392.

Вы можете наложить float на номер uint, а затем использовать стандартный механизм форматирования как шестнадцатеричное строковое значение. Например. ((uint)myFloat).ToString("X"). Но когда вы это сделаете, вы начнете с усеченного значения, а вывод будет "C0451F00" (или "0xC0451F00", если вы включите стандартный префикс шестнадцатеричного указателя в строку формата).

Как только вы обрезаете исходное значение, его невозможно восстановить. Вы не можете отменить процесс.

+0

. Спасибо, Питер, неудивительно, что я даже не попробовал простое преобразование в целое число без знака, а затем получил форматированную строку. Это работает пока. Благодарим вас за подробное объяснение, большое спасибо. – nullable

0

В документации сказано, использовать BitConverter.ToString Method (Byte[])on msdn

Это вернет строковое представление числа в шестнадцатеричной базе. Пример (для массива байтов, представляющих ряд):

00-01-02-04-08-10-20-40-80-FF 
+0

Извините, это не работает. Это приведет к выходу 1F-40-45-1F, где я ожидаю, что он выведет B8-1E-45-C0 – nullable