Прямой порядок байтов C# или обратный порядок байтов?

Выполните следующие действия:

  • Определите ISelf<T> с единственным параметром Self, доступным только для чтения, который возвращает T и ICloneable<out T>, который происходит из ISelf<T>, и включает метод T Clone().
  • Затем определите тип CloneBase, который реализует кастинг protected virtual generic VirtualClone MemberwiseClone для переданного типа.
  • Каждый производный тип должен реализовать VirtualClone, вызывая метод базового клона, а затем делать все, что нужно сделать, чтобы правильно клонировать те аспекты производного типа, которые родительский метод VirtualClone еще не обработал.

Для максимальной универсальности наследования классы, демонстрирующие функциональность публичного клонирования, должны быть sealed, но должны быть получены из базового класса, который в противном случае идентичен, за исключением отсутствия клонирования. Вместо того, чтобы передавать переменные явного клонируемого типа, возьмите параметр типа ICloneable<theNonCloneableType>. Это позволит подпрограмме, которая ожидает, что клонированная производная Foo будет работать с клонируемой производной от DerivedFoo, но также позволит создавать некланируемые производные Foo.

62
задан GEOCHET 26 March 2009 в 22:59
поделиться

4 ответа

Сам C# не определяет порядок байтов. Каждый раз, когда Вы преобразовываете в байты, однако, Вы делаете выбор. класс BitConverter имеет поле IsLittleEndian, чтобы сказать Вам, как это будет вести себя, но это не дает выбор. То же идет для BinaryReader/BinaryWriter.

Мой библиотека MiscUtil имеет класс EndianBitConverter, который позволяет Вам определять порядок байтов; существуют подобные эквиваленты для BinaryReader/Writer. Никакое использование онлайн не ведет, я боюсь, но они тривиальны:)

(EndianBitConverter также имеет часть функциональности, которая не присутствует в нормальном BitConverter, который должен сделать преобразования, оперативные в массиве байтов.)

80
ответ дан Jon Skeet 24 November 2019 в 16:41
поделиться

Можно также использовать

IPAddress.NetworkToHostOrder(...)

, Если коротко, интервал или долго.

46
ответ дан Jan Bannister 24 November 2019 в 16:41
поделиться

Прямой порядок байтов ре, короткий ответ (чтобы сделать я должен сделать что-либо), "вероятно, не, но это зависит от Ваших аппаратных средств". Можно свериться:

bool le = BitConverter.IsLittleEndian;

В зависимости от того, что это говорит, Вы могли бы хотеть инвертировать части своих буферов. С другой стороны, у Jon Skeet есть преобразователи определенного порядка байтов здесь (ищите EndianBitConverter).

Примечание, что itaniums (например), являются обратным порядком байтов. Большинство Intels является прямым порядком байтов.

Ре определенный UDP/IP...?

10
ответ дан Marc Gravell 24 November 2019 в 16:41
поделиться

Необходимо знать о порядке байтов ЦП, а также сетевом порядке байтов.

Обычно для TCP/UDP comms, Вы всегда преобразовываете данные в сетевой порядок байтов с помощью htons функция (и ntohs и их связанные функции).

порядок сети Normally является обратным порядком байтов, но в этом случае (по некоторым причинам!) comms является прямым порядком байтов, таким образом, те функции не очень полезны. Это важно, поскольку Вы не можете принять UDP comms, они реализовали, следуют любым другим стандартам, он также делает жизнь трудной, если у Вас есть архитектура с обратным порядком байтов, поскольку Вы просто не можете обернуть все с htons, поскольку Вы должны:-(

Однако, если Вы происходите из архитектуры Intel x86, тогда Вы уже - прямой порядок байтов, поэтому просто отправляете данные без преобразования.

3
ответ дан Martin Liversage 24 November 2019 в 16:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: