public void WriteExtension <T>(byte extensionCode, T value) where T : struct { var size = Unsafe.SizeOf <T>(); switch (size) { case 1: Append(FixExt1); Append(extensionCode); Append(Unsafe.As <T, byte>(ref value)); return; case 2: Append(FixExt2); Append(extensionCode); Append2(Unsafe.As <T, ushort>(ref value)); return; case 4: Append(FixExt4); Append(extensionCode); Append4(Unsafe.As <T, uint>(ref value)); return; case 8: Append(FixExt8); Append(extensionCode); Append8(Unsafe.As <T, ulong>(ref value)); return; case 16: Append(FixExt16); Append(extensionCode); Append16(ref Unsafe.As <T, ulong>(ref value)); return; } Internal(); void Internal() { if (size <= byte.MaxValue) { Append(Ext8); Append((byte)size); } else if (size <= ushort.MaxValue) { Append(Ext16); Append2((ushort)size); } else { Append(Ext32); Append4((uint)size); } Append(extensionCode); ref var bytes = ref Unsafe.AsByte(ref value); while (size >= 8) { size -= 8; Append8(Unsafe.As <byte, ulong>(ref Unsafe.AddByteOffset(ref bytes, size))); } if (size >= 4) { size -= 4; Append4(Unsafe.As <byte, uint>(ref Unsafe.AddByteOffset(ref bytes, size))); } if (size >= 2) { size -= 2; Append2(Unsafe.As <byte, ushort>(ref Unsafe.AddByteOffset(ref bytes, size))); } if (size >= 1) { // --size; Append(bytes); } }