Ну, тема "Порядка байтов" всегда немного сбивала с толку меня, но я никогда не сталкивался ни с какими проблемами, которые потребовали, чтобы я даже думал о поведении по умолчанию двоичных устройств записи/читателей, что использовал. Я пишу декодер PNG в c# прямо сейчас. Спецификация формата файла PNG указывает, что все числа хранятся в нотации с обратным порядком байтов (который я нахожу очень естественными). Однако я был очень удивлен, когда я заметил, что BinaryReader/Writer.NET работает с небольшой нотацией порядка байтов. Что смутило меня еще больше, был факт, что двоичный IO Java работает с нотацией с обратным порядком байтов (не программист Java, поэтому возможно, я неправ). Таким образом, я начал думать о следующих вопросах:
1 - Почему состоят в том вещи, как они? Я имею в виду поведение значения по умолчанию Библиотеки базовых классов. 2 - Почему нет никакого способа выбрать предпочтительную нотацию при использовании Системы.NET. IO?
Я в настоящее время использую Jon Skeet MiscUtil, и он работает как очарование (спасибо, человек =)). Но было бы здорово видеть эту функциональность в Библиотеке базовых классов.
Это потому, что код предназначен для максимально эффективной работы на самой важной платформе. C # /. NET от Microsoft и работает в основном на платформах x86. x86 имеет прямой порядок байтов, поэтому имеет смысл сделать библиотеку с прямым порядком байтов. Java создается Sun, а Sun SPARC был прямым порядком байтов, поэтому стандарт Java был прямым порядком байтов.
Я полагаю, это сводится к всегда возможность иметь дело с обоими , независимо от платформы, на которой вы находитесь. Преон пытается скрыть часть этой сложности, позволяя декларативно (с использованием аннотаций) определять отображение между вашим представлением данных в памяти и закодированным представлением.
Итак, если это часть вашей структуры данных:
public Image {
int width;
int height;
}
, тогда определение отображения в естественное представление с прямым порядком байтов будет так же просто, как это:
public Image {
@BoundNumber int width;
@BoundNumber int height;
}
Однако, если представление является прямым порядком байтов, тогда вы можете сделать это :
public Image {
@BoundNumber(byteOrder=LittleEndian) int width;
@BoundNumber(byteOrder=LittleEndian) int height;
}
В обоих случаях создание кодека для этой структуры данных одно и то же:
Codec<Image> codec = Codecs.create(Image.class);
Я знаю, что некоторые люди также говорили о переносе этого на .NET.
BCL содержит элементы статического класса System.BitConverter
, которые позволяют вам иметь дело с порядком байтов в системе. В результате все методы в BitConverter практически не зависят от платформы.
Кроме того, метод System.Net.IPAddress.NetworkToHostOrder
позволяет изменять порядок байтов с большого на малый и наоборот.