Endianness в языках программирования - PullRequest
6 голосов
/ 28 февраля 2010

Что ж, тема «Endianness» всегда немного сбивала меня с толку, но я никогда не сталкивался с какими-либо проблемами, которые заставляли меня даже думать о поведении двоичных писателей / читателей по умолчанию, которое я использовал. Я пишу PNG-декодер в C # прямо сейчас. Спецификация формата файла PNG гласит, что все числа хранятся в формате с прямым порядком байтов (что я считаю очень естественным). Тем не менее, я был очень удивлен, когда заметил, что .NET BinaryReader / Writer работает с порядковым порядком записи. Еще больше меня смутил тот факт, что двоичный ввод-вывод Java работает с нотацией с прямым порядком байтов (я не программист Java, так что, возможно, я ошибаюсь). Поэтому я начал думать о следующих вопросах:

1 - Почему вещи такие, какие они есть? Я имею в виду поведение библиотеки базовых классов по умолчанию. 2 - Почему нет способа выбрать предпочтительную нотацию при использовании .NET System.IO?

В настоящее время я использую Jon Skeet's MiscUtil , и он работает как заклинание (спасибо, мужик =)). Но было бы здорово увидеть эту функцию в библиотеке базовых классов.

Ответы [ 3 ]

10 голосов
/ 28 февраля 2010

Это потому, что код предназначен для максимально возможного запуска на самой важной платформе. C # / .NET от Microsoft и работает в основном на платформах x86. x86 имеет младший порядок байтов, поэтому имеет смысл сделать библиотеку с прямым порядком байтов. Java создана Sun, а Sun SPARC был с прямым порядком байтов, поэтому стандарт Java был с прямым порядком байтов.

2 голосов
/ 28 февраля 2010

BCL содержит вещи в статическом классе System.BitConverter, которые позволяют вам иметь дело с системным порядком байтов. В результате все методы в BitConverter не зависят от платформы.

Кроме того, метод System.Net.IPAddress.NetworkToHostOrder позволяет вам изменять порядковый номер байтов от большого к младшему и наоборот.

1 голос
/ 01 марта 2010

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

Итак, если это часть вашей структуры данных:

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.

...