Home > Back-end >  How to form 32 bit integer by using four custom bytes?
How to form 32 bit integer by using four custom bytes?

Time:12-26

I want to create a 32 bit integer programmatically from four bytes 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 ?)

  • Related