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).