I want to create a 32
bit integer programmatically from four byte
s in hex such as:
Lowest byte is AA
Middle byte is BB
Other middle byte is CC
Highest byte is DD
I want to use the variable names for that where:
byte myByte_1 = 0xAA
byte myByte_2 = 0xBB
byte myByte_3 = 0xCC
byte myByte_4 = 0xDD
So by using the above bytes and using bitwise operations how can we obtain: 0xDDAABBCC
?
CodePudding user response:
You can construct such int
explicitly with a help of bit operations:
int result = myByte_4 << 24 |
myByte_3 << 16 |
myByte_2 << 8 |
myByte_1;
please, note that we have an integer overflow and result
is a negative number:
Console.Write($"{result} (0x{result:X})");
Outcome;
-573785174 (0xDDCCBBAA)
BitConverter
is an alternative, which is IMHO too wordy:
int result = BitConverter.ToInt32(BitConverter.IsLittleEndian
? new byte[] { myByte_1, myByte_2, myByte_3, myByte_4 }
: new byte[] { myByte_4, myByte_3, myByte_2, myByte_1 });
CodePudding user response:
We can do this by asking C# to make us a struct that shares memory space for its members:
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct Bynteger{
[FieldOffset(0)]
public byte Lowest;
[FieldOffset(1)]
public byte Middle;
[FieldOffset(2)]
public byte OtherMiddle;
[FieldOffset(3)]
public byte Highest;
[FieldOffset(0)]
public int Int;
[FieldOffset(0)]
public uint UInt;
}
If you assign to those bytes then read the int
or the uint
you'll get the value:
var b = new Bynteger{
Lowest = 0xAA,
Middle = 0xBB,
OtherMiddle = 0xCC,
Highest = 0xDD
};
Console.WriteLine(b.Int); //prints -573785174
Console.WriteLine(b.UInt); //prints 3721182122
Console.WriteLine(b.UInt.ToString("X")); //prints 0xDDCCBBAA
how can we obtain: 0xDDAABBCC ?
Er.. If 0xDD AA BB CC
isn't a typo (did you mean to say 0xDD CCBBAA`?), you can jiggle the layout around by changing the number in the FieldOffset, e.g.:
[FieldOffset(2)]
public byte Lowest;
[FieldOffset(1)]
public byte Middle;
[FieldOffset(0)]
public byte OtherMiddle;
[FieldOffset(3)]
public byte Highest;
Will give you the 0xDDAABBCC you requested, if you keep the assignments you said (Lowest = 0xAA etc)
You're free to name the fields however you like too.. (perhaps B1 to B4 ?)