Skip to content

Instantly share code, notes, and snippets.

@oto313
Created September 25, 2018 07:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oto313/273b8b6aa8c9ed93f88727e3821e19b7 to your computer and use it in GitHub Desktop.
Save oto313/273b8b6aa8c9ed93f88727e3821e19b7 to your computer and use it in GitHub Desktop.
public static T ToStructure<T>(this byte[] rawData, Endianness endianness = Endianness.LittleEndian)
where T : struct
{
T result;
MaybeAdjustEndianness(typeof(T), rawData, endianness);
var handle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
try {
var rawDataPtr = handle.AddrOfPinnedObject();
result = (T) Marshal.PtrToStructure(rawDataPtr, typeof(T));
} finally {
handle.Free();
}
return result;
}
public static byte[] ToByteArray<T>(this T data, Endianness endianness = Endianness.LittleEndian)
where T : struct
{
var rawData = new byte[Marshal.SizeOf(data)];
var handle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
try {
var rawDataPtr = handle.AddrOfPinnedObject();
Marshal.StructureToPtr(data, rawDataPtr, false);
} finally {
handle.Free();
}
MaybeAdjustEndianness(typeof(T), rawData, endianness);
return rawData;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment