ntohs() и ntohl() аналог?

есть ли net для размещения функций преобразования в C#? Гуглить и не найти много. : P

3 ответов


IPAddress.HostToNetworkOrder и IPAddress.NetworkToHostOrder?

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


@Джон Скит ответ Это самый точный по вашему вопросу. Однако функции "ntoh_" и "hton_" c широко используются для перевода между мало-endian и big-endian, в компьютерных архитектур.

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

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

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

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

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