C# Miscellaneous Examples
C# Basic
C# Data Type
C# OOP
C# IO
C# Graphics & UI
C# Advanced
To convert a structure to a byte array in C#, you can use the BitConverter
class and the Marshal
class. Here's an example:
using
statements:using System; using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 1)] public struct SampleStruct { public int Id; public float Value; }
The StructLayout
attribute is used to specify the layout of the structure in memory. The Pack
field is set to 1 to ensure that there's no padding between the fields in the structure.
public static byte[] StructToByteArray<T>(T structure) where T : struct { int size = Marshal.SizeOf(structure); byte[] byteArray = new byte[size]; IntPtr ptr = Marshal.AllocHGlobal(size); try { Marshal.StructureToPtr(structure, ptr, true); Marshal.Copy(ptr, byteArray, 0, size); } finally { Marshal.FreeHGlobal(ptr); } return byteArray; }
In this method, you first calculate the size of the structure using the Marshal.SizeOf()
method. Then, you allocate memory for the structure using Marshal.AllocHGlobal()
and copy the structure to the allocated memory using Marshal.StructureToPtr()
. Finally, you copy the memory to a byte array using Marshal.Copy()
and free the allocated memory using Marshal.FreeHGlobal()
.
StructToByteArray()
method to convert a structure to a byte array:SampleStruct sampleStruct = new SampleStruct { Id = 42, Value = 3.14f }; byte[] byteArray = StructToByteArray(sampleStruct); foreach (byte b in byteArray) { Console.Write(b + " "); }
In this example, you create a SampleStruct
instance, then call the StructToByteArray()
method to convert it to a byte array. The byte array is printed to the console.
C# convert struct to byte array example:
struct SampleStruct { public int Value; public float FloatValue; } SampleStruct sampleStruct = new SampleStruct { Value = 42, FloatValue = 3.14f }; byte[] byteArray = BitConverter.GetBytes(sampleStruct.Value); byteArray = byteArray.Concat(BitConverter.GetBytes(sampleStruct.FloatValue)).ToArray(); // Result: [42, 0, 0, 0, 195, 245, 72, 64] (Little-endian byte order)
Serialize struct to byte array in C#: Using serialization techniques to convert a struct to a byte array.
struct SampleStruct { public int Value; public float FloatValue; } SampleStruct sampleStruct = new SampleStruct { Value = 42, FloatValue = 3.14f }; byte[] byteArray; using (MemoryStream stream = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, sampleStruct); byteArray = stream.ToArray(); } // Result: Serialized byte array
Using BitConverter to convert struct to byte array in C#:
struct SampleStruct { public int Value; public float FloatValue; } SampleStruct sampleStruct = new SampleStruct { Value = 42, FloatValue = 3.14f }; byte[] byteArray = new byte[Marshal.SizeOf(sampleStruct)]; Buffer.BlockCopy(BitConverter.GetBytes(sampleStruct.Value), 0, byteArray, 0, sizeof(int)); Buffer.BlockCopy(BitConverter.GetBytes(sampleStruct.FloatValue), 0, byteArray, sizeof(int), sizeof(float)); // Result: [42, 0, 0, 0, 195, 245, 72, 64] (Little-endian byte order)
C# struct serialization to byte array:
Using the MemoryStream
and BinaryWriter
for serialization.
struct SampleStruct { public int Value; public float FloatValue; } SampleStruct sampleStruct = new SampleStruct { Value = 42, FloatValue = 3.14f }; byte[] byteArray; using (MemoryStream stream = new MemoryStream()) using (BinaryWriter writer = new BinaryWriter(stream)) { writer.Write(sampleStruct.Value); writer.Write(sampleStruct.FloatValue); byteArray = stream.ToArray(); } // Result: Serialized byte array
Marshalling struct to byte array in C#:
Using Marshal
class for struct marshalling.
struct SampleStruct { public int Value; public float FloatValue; } SampleStruct sampleStruct = new SampleStruct { Value = 42, FloatValue = 3.14f }; int size = Marshal.SizeOf(sampleStruct); byte[] byteArray = new byte[size]; IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(byteArray, 0); Marshal.StructureToPtr(sampleStruct, ptr, false); // Result: Serialized byte array
Struct memory layout in C# for byte array conversion:
[StructLayout(LayoutKind.Sequential)] struct SampleStruct { public int Value; public float FloatValue; } SampleStruct sampleStruct = new SampleStruct { Value = 42, FloatValue = 3.14f }; byte[] byteArray = new byte[Marshal.SizeOf(sampleStruct)]; GCHandle handle = GCHandle.Alloc(byteArray, GCHandleType.Pinned); Marshal.StructureToPtr(sampleStruct, handle.AddrOfPinnedObject(), false); handle.Free(); // Result: Serialized byte array
Binary serialization of struct in C#:
Using BinaryFormatter
for struct binary serialization.
[Serializable] struct SampleStruct { public int Value; public float FloatValue; } SampleStruct sampleStruct = new SampleStruct { Value = 42, FloatValue = 3.14f }; byte[] byteArray; using (MemoryStream stream = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, sampleStruct); byteArray = stream.ToArray(); } // Result: Serialized byte array
C# unsafe code for struct to byte array conversion: Using unsafe code and pointers for struct to byte array conversion.
struct SampleStruct { public int Value; public float FloatValue; } SampleStruct sampleStruct = new SampleStruct { Value = 42, FloatValue = 3.14f }; byte[] byteArray = new byte[sizeof(SampleStruct)]; unsafe { fixed (byte* bytePtr = byteArray) { *(SampleStruct*)bytePtr = sampleStruct; } } // Result: Serialized byte array
Little-endian and big-endian byte order in C# struct serialization:
[StructLayout(LayoutKind.Sequential, Pack = 1)] struct SampleStruct { public short Value; public short FloatValue; } SampleStruct sampleStruct = new SampleStruct { Value = 42, FloatValue = 32000 }; // Little-endian byte order byte[] littleEndianBytes = BitConverter.GetBytes(sampleStruct.Value).Concat(BitConverter.GetBytes(sampleStruct.FloatValue)).ToArray(); // Big-endian byte order byte[] bigEndianBytes = BitConverter.GetBytes((short)IPAddress.HostToNetworkOrder(sampleStruct.Value)).Concat(BitConverter.GetBytes((short)IPAddress.HostToNetworkOrder(sampleStruct.FloatValue))).ToArray();
Custom struct serialization to byte array in C#: Implementing a custom serialization method for the struct.
struct SampleStruct { public int Value; public float FloatValue; public byte[] ToByteArray() { List<byte> bytes = new List<byte>(); bytes.AddRange(BitConverter.GetBytes(Value)); bytes.AddRange(BitConverter.GetBytes(FloatValue)); return bytes.ToArray(); } } SampleStruct sampleStruct = new SampleStruct { Value = 42, FloatValue = 3.14f }; byte[] byteArray = sampleStruct.ToByteArray(); // Result: Serialized byte array