First of all, I think this question is not C# independent. But can also be used in other languages like C.
I'm now trying to parse a file format which stores integers in 4 bytes little-endian format. TBH, I don't know how the little-endian format nor big-endian format works.
But I need to convert them into an usable int variable.
For example, 02 00 00 00 = 2
So far, I have this code to convert the first 2 bytes: (I used FileStream.Read to store the raw datas into a buffer variable)
int num = ((buffer[5] << 8) + buffer[4]);
But it will only convert the first two bytes. (02 00 in the example, not 02 00 00 00)
Any kind of help would be appreciated :)
int GetBigEndianIntegerFromByteArray(byte[] data, int startIndex) {
return (data[startIndex] << 24)
| (data[startIndex + 1] << 16)
| (data[startIndex + 2] << 8)
| data[startIndex + 3];
}
int GetLittleEndianIntegerFromByteArray(byte[] data, int startIndex) {
return (data[startIndex + 3] << 24)
| (data[startIndex + 2] << 16)
| (data[startIndex + 1] << 8)
| data[startIndex];
}
Using built-in methods:
byte[] data = { 2, 0, 0, 0 };
Array.Reverse(data);
int value = BitConverter.ToInt32(data, 0);
On the other side of the spectrum, using optimised unsafe code:
public static unsafe void SwapInts(int[] data) {
int cnt = data.Length;
fixed (int* d = data) {
byte* p = (byte*)d;
while (cnt-- > 0) {
byte a = *p;
p++;
byte b = *p;
*p = *(p + 1);
p++;
*p = b;
p++;
*(p - 3) = *p;
*p = a;
p++;
}
}
}
Note: You can use the BitConverter.IsLittleEndian
to check if the computer is using little endian or big endian internally, so that you can make the code portable.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With