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.