Are there net to host conversion functions in C#? Googling and not finding much. :P
IPAddress.HostToNetworkOrder
and IPAddress.NetworkToHostOrder
?
Each method has overloads for 16, 32 and 64 bit integers.
ntohs
and ntohl
would be NetworkToHostOrder
, but with different overloads for the different sizes. –
Wellhead uint
I got from a udp socket, and NetworkToHostOrder
doesn't accept unsigned (since unsigned numbers are not CLS compliant), and silently converted them to long
, which is obviously wrong. The solution is to use BitConverter
. –
Fimbriation int
, and cast the result back to uint
. –
Wellhead The System.Memory nuget package includes the System.Buffers.Binary.BinaryPrimitives
static class, which includes static methods for dealing with "endianness", including many overloads of ReverseEndianness
. On dotnet core, HostToNetWorkOrder
is implemented using these ReverseEndianness
methods . On a little-endian architecture (which I think is all that support .NET) HostToNetworkOrder
and ReverseEndianness
methods have identical performance on dotnetcore.
On dotnet framework (net461) however, the performance of calling HostToNetworkOrder
is slightly (not quite 2x) slower than calling ReverseEndianness
.
I believe that the JIT compiler is actually special casing these methods to invoke the BSWAP x86 instruction. If you exactly duplicate the implementation of the ReverseEndianness(long)
method in your own codebase, it will be nearly 4x slower than calling the System.Memory
implementation; suggesting there is JIT magic happening.
@jon-skeet's answer is the most accurate according to your question. However, 'ntoh_' and 'hton_' C functions are extensively used in order to translate between little-endian and big-endian computer architectures.
If your intention is to perform endianess conversions, there is a BitConverter class (static class in the core assembly) that brings you a more suitable way. Specially when:
- Working with array of bytes (widely used in file or network streams).
- Detecting endianess architecture of the runtime machine.
- Converting basic structures beyond integers (booleans, decimals) without typecasting.
- Your code is not related to network operations (System.Net namespace).
BitConverter
doesn't support any non-native endianness. (At least the built-in one doesn't, Jon or Marc made a more powerful one that does -- but making garbage temporary arrays is still a waste) –
Scylla © 2022 - 2024 — McMap. All rights reserved.