ntohs() и ntohl() эквивалентны?

Есть ли в C# функции преобразования в сеть? Погуглил и не нашел много.:П

3 ответа

Решение

IPAddress.HostToNetworkOrder а также IPAddress.NetworkToHostOrder?

Каждый метод имеет перегрузки для 16, 32 и 64-битных целых чисел.

Пакет nuget System.Memory включает System.Buffers.Binary.BinaryPrimitives статический класс, который включает статические методы для работы с "порядком байтов", включая множество перегрузок ReverseEndianness, На дотнет ядре, HostToNetWorkOrder реализуется с использованием этих ReverseEndianness методы. На архитектуре с прямым порядком байтов (которая, я думаю, поддерживает все.NET) HostToNetworkOrder а также ReverseEndianness методы имеют одинаковую производительность на dotnetcore.

Однако в среде dotnet (net461) производительность вызова HostToNetworkOrder немного (не совсем в 2 раза) медленнее, чем звонить ReverseEndianness,

Я считаю, что JIT-компилятор на самом деле является специальным случаем, когда эти методы используются для вызова инструкции BSWAP x86. Если вы точно дублируете реализацию ReverseEndianness(long) метод в вашей собственной кодовой базе, это будет почти в 4 раза медленнее, чем вызов System.Memory реализация; предполагая, что происходит магия JIT.

Ответ @jon-skeet является наиболее точным в соответствии с вашим вопросом. Тем не менее, функции 'ntoh_' и 'hton_' C широко используются для перевода между компьютерными архитектурами с прямым и прямым порядком байтов.

Если вы намереваетесь выполнять преобразования с порядком байтов, существует класс BitConverter (статический класс в базовой сборке), который предлагает вам более подходящий способ. Особенно когда:

  • Работа с массивом байтов (широко используется в файловых или сетевых потоках).
  • Обнаружение бесконечности архитектуры машины времени выполнения.
  • Преобразование базовых структур за целые числа (логические значения, десятичные числа) без приведения типов.
  • Ваш код не связан с сетевыми операциями (пространство имен System.Net).
Другие вопросы по тегам