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);
                }
            }