Код: Выделить всё
var before = new [] { (byte)0, (byte)0, (byte)129, (byte)255 };
var f = BitConverter.ToSingle(before, 0); // Results in NaN
var after = BitConverter.GetBytes(f); // Results in bytes 0, 0, 193, 255
Код: Выделить всё
0, 0, 129, 255Любопытно, что запуск этого же примера с байтами 0, 0, 128, 255 является правильным (значение для плавающей точки f . 0, 0, 128, 255 снова). Учитывая этот факт, я подозреваю, что NAN является актуальным.
Может ли кто -нибудь пролить свет на то, что здесь происходит? Этот вопрос пытается преобразовать байты в ценность (в этом случае два байта в короткое время), и неправильная эндоуность дала неожиданную ценность. В моем случае фактическое значение поплавки не имеет значения (поскольку я не использую преобразованное значение в качестве плавания). Вместо этого я пытаюсь эффективно переосмыслить четыре байта как плавание напрямую , сначала преобразовав в поплавок, а затем конвертируя обратно. Как показано, эта обратная и порядок иногда возвращает разные байты, чем те, которые я отправил. Как комментирует Питер Дунихо, BitConverter никогда не будет изменять байты, которые вы проходите, но просто скопируйте их в новое местоположение памяти и переосмыслить результат. Однако, как показывает мой пример, можно отправить в четыре байта (
Код: Выделить всё
0, 0, 129, 255Код: Выделить всё
0, 0, 193, 255Эндианство часто упоминается в отношении BitConverter . Тем не менее, в этом случае я чувствую, что эндианство не является проблемой корня. Когда я называю BitConverter.tosingle , я прохожу массив из четырех байтов. Эти байты представляют какое -то бинарное (32 бита), которые преобразуются в поплавок. Изменив эндсивство до вызова функции , все, что я делаю, это изменение битов, которые я отправляю в функцию . Независимо от значения этих битов, должно быть возможно преобразовать их в поплавок (также 32 бита), а затем преобразовать плавание обратно, чтобы получить те же биты, которые я отправил в . Как показано в моем примере, использование байтов 0, 0, 129, 255 (двоичный 0000000000000000100000000111111111 ) приводит к значению с плавающей точкой. Я хотел бы взять это значение (плавание, представленное этими битами) и преобразовать его в исходные четыре байта.
Это возможно во всех случаях?
Подробнее здесь: https://stackoverflow.com/questions/674 ... ing-floats
Мобильная версия