Reputation: 1384
Im trying to cast a 4 byte array to an ulong in C#. I'm currently using this code:
atomSize = BitConverter.ToUInt32(buffer, 0);
The byte[4] contains this:
0 0 0 32
However, the bytes are Big-Endian. Is there a simple way to convert this Big-Endian ulong to a Little-Endian ulong?
Upvotes: 19
Views: 20989
Reputation: 3979
In .net core (>= 2.1), you can use this instead:
BinaryPrimitives.ReadUInt32BigEndian(buffer);
That way, you're sure of the endianness you're reading from.
It's implemented there in case you're wondering how it works
Edit: as mentionned by @smkanadl in the comments, it seems that you can use this API as well in .net framework by installing the System.Memory
package.
Upvotes: 10
Reputation: 95
This may be old but I'm surprised no one came up with this simplest answer yet, only requires one line...
// buffer is 00 00 00 32
Array.Reverse(buffer);
// buffer is 32 00 00 00
atomSize = BitConverter.ToUInt32(buffer, 0);
I'm using it to compare checksums generated in C# (little-endian) with checksums generated in Java (big-endian).
Upvotes: 3
Reputation: 837936
I believe that the EndianBitConverter in Jon Skeet's MiscUtil library (nuget link) can do what you want.
You could also swap the bits using bit shift operations:
uint swapEndianness(uint x)
{
return ((x & 0x000000ff) << 24) + // First byte
((x & 0x0000ff00) << 8) + // Second byte
((x & 0x00ff0000) >> 8) + // Third byte
((x & 0xff000000) >> 24); // Fourth byte
}
Usage:
atomSize = BitConverter.ToUInt32(buffer, 0);
atomSize = swapEndianness(atomSize);
Upvotes: 25
Reputation: 4573
firstSingle = BitConverter.ToSingle(buffer,0);
secondSingle = BitConverter.ToSingle(buffer,2);
var result = BitConverter.ToUInt32(BitConverter.GetBytes(secondSingle).Concat(BitConverter.GetBytes(firstSingle).ToArray());
Upvotes: 0
Reputation: 15819
I recommend using Mono's DataConvert
which is like BitConverter
on steroids. It allows you to read in big-endian byte arrays directly and improves massively on BitConverter
.
A direct link to the source is here.
Upvotes: 5
Reputation: 13897
System.Net.IPAddress.NetworkToHostOrder(atomSize);
will flip your bytes.
Upvotes: 7