internal static void WriteTagWithLength(int length, Pattern topPattern, Pattern bottomPattern)
 {
     if (length > 63 || length < 0)
     {
         var bytes = LittleEndianToNetworkOrderBitConverter.GetBytes(length);
         WriteBottomPatternAndBytes(bottomPattern, bytes);
     }
     else
     {
         _buffer.WriteByte((byte)((int)topPattern | length));
     }
 }
        private void SerializeValue(object value)
        {
            switch (Type.GetTypeCode(value.GetType()))
            {
            case TypeCode.String:
                Writer.WriteTagWithLength(Encoding.UTF8.GetBytes(value as string).Length, Pattern.STRING_SHORT_PATTERN, Pattern.STRING_PATTERN);
                Writer.Write(Encoding.UTF8.GetBytes(value as string));
                break;

            case TypeCode.Int32:
                Writer.WriteTagWithLength((int)value, Pattern.UNSIGNED_INT_SHORT_PATTERN, Pattern.INT_PATTERN);
                break;

            case TypeCode.UInt32:
                Writer.WriteBottomPatternAndBytes(Pattern.UNSIGNED_INT_PATTERN, LittleEndianToNetworkOrderBitConverter.GetBytes((uint)value));
                break;

            case TypeCode.Int64:
                Writer.WriteLongPattern(Pattern.LONG_SHORT_PATTERN, Pattern.LONG_PATTERN, LittleEndianToNetworkOrderBitConverter.GetBytes((long)value));
                break;

            case TypeCode.UInt64:
                Writer.WriteLongPattern(Pattern.UNSIGNED_LONG_SHORT_PATTERN, Pattern.UNSIGNED_LONG_PATTERN, LittleEndianToNetworkOrderBitConverter.GetBytes((ulong)value));
                break;

            case TypeCode.Double:
                Writer.Write(Pattern.DOUBLE_PATTERN);
                Writer.Write(LittleEndianToNetworkOrderBitConverter.GetBytes((double)value));
                break;

            case TypeCode.Single:
                Writer.Write(Pattern.FLOAT_PATTERN);
                Writer.Write(LittleEndianToNetworkOrderBitConverter.GetBytes((float)value));
                break;

            case TypeCode.Boolean:
                Writer.Write((bool)value ? Pattern.BOOLEAN_TRUE_PATTERN : Pattern.BOOLEAN_FALSE_PATTERN);
                break;

            case TypeCode.Object:
                if (!(value is byte[]))
                {
                    break;
                }

                var array = (byte[])value;

                Writer.WriteTagWithLength(array.Length, Pattern.BYTE_ARRAY_SHORT_PATTERN, Pattern.BYTE_ARRAY_PATTERN);
                Writer.Write(array);
                break;
            }
        }