плавать в Little Endian Преобразование в C # - PullRequest
2 голосов
/ 03 октября 2019

Я хочу преобразовать некоторые значения в little-endian. У меня нет проблем с преобразованием int в little-endian следующим образом

private string ConverToLittleendian(string value)
{            
   var reversedBytes = System.Net.IPAddress.NetworkToHostOrder(Convert.ToInt32(value)); 
   var littleEndienSerialNumber = reversedBytes.ToString("x");    
   return  littleEndienSerialNumber.PadLeft(8, '0').ToUpper();
}

, а для float я не могу дать значение float в NetworkHostOrder, потому что он ожидает целое число.

Так что я 'мы нашли следующий код

private string ConverToLittleendian(float value)
{ 
   byte[] bytes = BitConverter.GetBytes(value);
   Array.Reverse(bytes);
   return BitConverter.ToString(bytes).Replace("-", "");
}

, так или иначе, это дает неправильное значение. Я проверил эти методы с 1234 (я знаю, что это не число с плавающей запятой, но в данном случае это должно было сработать)

Первый метод, который я получаю результат D2040000, и второй метод, который я получаю результат 449A4000

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

где я делаю ошибку?

1 Ответ

4 голосов
/ 03 октября 2019

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

Числа с плавающей запятой (в C #) используют IEEE 754 для представления их в двоичном формате - в общем, этоis (в big-endian):

{sign}{exponent}{mantissa}.

Целые числа являются более простыми, чем это - целое число со знаком представляется как:

{sign}(mantissa}.

1234 в виде числа с плавающей запятой 0x449A4000 в старшем порядке;0x00409A44 в младшем порядке.

1234 в виде целого числа равно 0x000004D2 в старшем порядке;0xD2040000 в порядке байтов (как ваш результат был).


Вы не ожидаете, что 1234 (целое число) будет иметь такое же двоичное представление, что и 1234.0 (число с плавающей точкой), потому что внутри онихранятся по-разному.

Если бы 1234 (как int) и 1234.0 (с плавающей точкой) имели одинаковое двоичное представление, можно ожидать, что 1235 будет отличаться на один бит в представлении int (это равно 0x000004D3 в формате с прямым порядком байтов; 0xD3040000 в порядке с прямым порядком байтов).

Но где же вы можете получить 1234,5 (число с плавающей запятой)? Ближайшее целочисленное представление можно получить 0x000004D2.8 (.8 - это шестнадцатеричный эквивалент .5 в десятичном виде). Вы не можете иметь целое двоичное число от 0x000004D2 до 0x000004D3. Вот тут-то и появляется арифметика с плавающей точкой - и поэтому они отличаются.

...