Порядок байтов на языках программирования

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

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

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

6
задан Community 23 May 2017 в 12:01
поделиться

3 ответа

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

10
ответ дан 8 December 2019 в 18:35
поделиться

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

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

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.

1
ответ дан 8 December 2019 в 18:35
поделиться

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

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

2
ответ дан 8 December 2019 в 18:35
поделиться