示例#1
0
		private static decimal ParseDecimal(BufferedTextReader reader, ref int cur, char matchEnd)
		{
			var neg = cur == '-';
			if (neg)
				cur = reader.Read();
			var buf = reader.SmallBuffer;
			buf[0] = (char)cur;
			var size = reader.ReadUntil(buf, 1, ',', matchEnd) + 1;
			cur = reader.Read();
			if (cur >= '0' && cur <= '9' || cur == '.')
				throw new FrameworkException("Too long decimal number: " + new string(buf, 0, size));
			if (size > 18)
			{
				if (neg)
					return -decimal.Parse(new string(buf, 0, size), Invariant);
				return decimal.Parse(new string(buf, 0, size), Invariant);
			}
			long value = 0;
			int scale = 0;
			char ch;
			for (int i = 0; i < size && i < buf.Length; i++)
			{
				ch = buf[i];
				if (ch == '.')
					scale = size - i - 1;
				else
					value = (value << 3) + (value << 1) + ch - 48;
			}
			return new decimal((int)value, (int)(value >> 32), 0, neg, (byte)scale);
		}
示例#2
0
        public static byte[] Deserialize(BufferedTextReader sr, int nextToken)
        {
            if (nextToken != '"')
            {
                throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken);
            }
            nextToken = sr.Read();
            if (nextToken == '"')
            {
                return(EmptyBytes);
            }
            var base64 = sr.LargeTempBuffer;
            var res    = new List <byte[]>();
            int total  = 0;
            int i      = 1;

            base64[0] = (char)nextToken;
            int len;

            while ((len = sr.ReadUntil(base64, i, '"')) > 0)
            {
                i += len;
                if (i == base64.Length)
                {
                    var bytes = Convert.FromBase64CharArray(base64, 0, base64.Length);
                    res.Add(bytes);
                    i      = 0;
                    total += bytes.Length;
                }
            }
            nextToken = sr.Read();
            if (i > 0)
            {
                var bytes = Convert.FromBase64CharArray(base64, 0, i);
                res.Add(bytes);
                total += bytes.Length;
            }
            if (nextToken != '"')
            {
                throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found end of stream.");
            }
            var result = new byte[total];
            var cur    = 0;

            for (i = 0; i < res.Count; i++)
            {
                var item = res[i];
                Array.Copy(item, 0, result, cur, item.Length);
                cur += item.Length;
            }
            return(result);
        }
示例#3
0
        private static decimal ParseDecimal(BufferedTextReader reader, ref int cur, char matchEnd)
        {
            var neg = cur == '-';

            if (neg)
            {
                cur = reader.Read();
            }
            var buf = reader.SmallBuffer;

            buf[0] = (char)cur;
            var size = reader.ReadUntil(buf, 1, ',', matchEnd) + 1;

            cur = reader.Read();
            if (cur >= '0' && cur <= '9' || cur == '.')
            {
                throw new FrameworkException("Too long decimal number: " + new string(buf, 0, size));
            }
            if (size > 18)
            {
                if (neg)
                {
                    return(-decimal.Parse(new string(buf, 0, size), Invariant));
                }
                return(decimal.Parse(new string(buf, 0, size), Invariant));
            }
            long value = 0;
            int  scale = 0;
            char ch;

            for (int i = 0; i < size && i < buf.Length; i++)
            {
                ch = buf[i];
                if (ch == '.')
                {
                    scale = size - i - 1;
                }
                else
                {
                    value = (value << 3) + (value << 1) + ch - 48;
                }
            }
            return(new decimal((int)value, (int)(value >> 32), 0, neg, (byte)scale));
        }
示例#4
0
        public static Stream DeserializeStream(BufferedTextReader sr, int nextToken)
        {
            if (nextToken != '"')
            {
                throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken);
            }
            nextToken = sr.Read();
            if (nextToken == '"')
            {
                return(new MemoryStream());
            }
            //TODO: lazy init stream (more lightweight!?)
            var res    = new ChunkedMemoryStream();
            var base64 = sr.LargeTempBuffer;
            int i      = 1;

            base64[0] = (char)nextToken;
            int len;

            while ((len = sr.ReadUntil(base64, i, '"')) > 0)
            {
                i += len;
                if (i == base64.Length)
                {
                    var bytes = Convert.FromBase64CharArray(base64, 0, base64.Length);
                    res.Write(bytes, 0, bytes.Length);
                    i = 0;
                }
            }
            nextToken = sr.Read();
            if (i > 0)
            {
                var bytes = Convert.FromBase64CharArray(base64, 0, i);
                res.Write(bytes, 0, bytes.Length);
            }
            if (nextToken != '"')
            {
                throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found end of stream.");
            }
            return(res);
        }
 private static DateTime ParseTimestampUtc(BufferedTextReader reader, int context)
 {
     var cur = reader.Read(context);
     var buf = reader.SmallBuffer;
     buf[0] = (char)cur;
     var len = reader.ReadUntil(buf, 1, '\\', '"') + 1;
     reader.Read(context);
     if (buf[10] != ' ')
         return DateTime.Parse(new string(buf, 0, len), CultureInfo.InvariantCulture);
     var year = NumberConverter.Read4(buf, 0);
     var month = NumberConverter.Read2(buf, 5);
     var date = NumberConverter.Read2(buf, 8);
     var hour = NumberConverter.Read2(buf, 11);
     var minutes = NumberConverter.Read2(buf, 14);
     var seconds = NumberConverter.Read2(buf, 17);
     if (buf[19] == '.')
     {
         long nano = 0;
         var max = len - 3;
         for (int i = 20, r = 0; i < max && r < TimestampReminder.Length && i < buf.Length; i++, r++)
             nano += TimestampReminder[r] * (buf[i] - 48);
         var pos = buf[len - 3] == '+';
         var offset = NumberConverter.Read2(buf, len - 2);
         var dt = offset != 0
             ? new DateTime(year, month, date, hour, minutes, seconds, DateTimeKind.Utc).AddHours(pos ? -offset : offset)
             : new DateTime(year, month, date, hour, minutes, seconds, DateTimeKind.Utc);
         return new DateTime(dt.Ticks + nano, DateTimeKind.Utc);
     }
     else
     {
         var pos = buf[len - 3] == '+';
         var offset = NumberConverter.Read2(buf, len - 2);
         if (offset != 0)
             return new DateTime(year, month, date, hour, minutes, seconds, DateTimeKind.Utc).AddHours(pos ? -offset : offset);
         return new DateTime(year, month, date, hour, minutes, seconds, DateTimeKind.Utc);
     }
 }
示例#6
0
        private static DateTime ParseTimestampUtc(BufferedTextReader reader, int context)
        {
            var cur = reader.Read(context);
            var buf = reader.SmallBuffer;

            buf[0] = (char)cur;
            var len = reader.ReadUntil(buf, 1, '\\', '"') + 1;

            reader.Read(context);
            if (buf[10] != ' ')
            {
                return(DateTime.Parse(new string(buf, 0, len), CultureInfo.InvariantCulture));
            }
            var year    = NumberConverter.Read4(buf, 0);
            var month   = NumberConverter.Read2(buf, 5);
            var date    = NumberConverter.Read2(buf, 8);
            var hour    = NumberConverter.Read2(buf, 11);
            var minutes = NumberConverter.Read2(buf, 14);
            var seconds = NumberConverter.Read2(buf, 17);

            if (buf[19] == '.')
            {
                long nano = 0;
                var  max  = len - 3;
                for (int i = 20, r = 0; i < max && r < TimestampReminder.Length && i < buf.Length; i++, r++)
                {
                    nano += TimestampReminder[r] * (buf[i] - 48);
                }
                var pos    = buf[len - 3] == '+';
                var offset = NumberConverter.Read2(buf, len - 2);
                var dt     = offset != 0
                                        ? new DateTime(year, month, date, hour, minutes, seconds, DateTimeKind.Utc).AddHours(pos ? -offset : offset)
                                        : new DateTime(year, month, date, hour, minutes, seconds, DateTimeKind.Utc);
                return(new DateTime(dt.Ticks + nano, DateTimeKind.Utc));
            }
            else if (len == 20 && buf[19] == 'Z')
            {
                return(new DateTime(year, month, date, hour, minutes, seconds, DateTimeKind.Utc));
            }
            else if (len == 22)
            {
                var pos    = buf[19] == '+';
                var offset = NumberConverter.Read2(buf, 20);
                if (offset != 0)
                {
                    return(new DateTime(year, month, date, hour, minutes, seconds, DateTimeKind.Utc).AddHours(pos ? -offset : offset));
                }
                return(new DateTime(year, month, date, hour, minutes, seconds, DateTimeKind.Utc));
            }
            else if (len == 25)
            {
                var pos        = buf[19] == '+';
                var offsetHour = NumberConverter.Read2(buf, 20);
                var offsetMin  = NumberConverter.Read2(buf, 23);
                return(new DateTime(year, month, date, hour, minutes, seconds, DateTimeKind.Utc)
                       .AddHours(pos ? -offsetHour : offsetHour)
                       .AddMinutes(pos ? -offsetMin : offsetMin));
            }
            else
            {
                buf[10] = 'T';
                return(DateTime.Parse(new string(buf, 0, len)));
            }
        }
示例#7
0
		public static byte[] Deserialize(BufferedTextReader sr, int nextToken)
		{
			if (nextToken != '"') throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken);
			nextToken = sr.Read();
			if (nextToken == '"') return EmptyBytes;
			var base64 = sr.LargeTempBuffer;
			var res = new List<byte[]>();
			int total = 0;
			int i = 1;
			base64[0] = (char)nextToken;
			int len;
			while ((len = sr.ReadUntil(base64, i, '"')) > 0)
			{
				i += len;
				if (i == base64.Length)
				{
					var bytes = Convert.FromBase64CharArray(base64, 0, base64.Length);
					res.Add(bytes);
					i = 0;
					total += bytes.Length;
				}
			}
			nextToken = sr.Read();
			if (i > 0)
			{
				var bytes = Convert.FromBase64CharArray(base64, 0, i);
				res.Add(bytes);
				total += bytes.Length;
			}
			if (nextToken != '"') throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found end of stream.");
			var result = new byte[total];
			var cur = 0;
			for (i = 0; i < res.Count; i++)
			{
				var item = res[i];
				Array.Copy(item, 0, result, cur, item.Length);
				cur += item.Length;
			}
			return result;
		}
示例#8
0
		public static Stream DeserializeStream(BufferedTextReader sr, int nextToken)
		{
			if (nextToken != '"') throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found " + (char)nextToken);
			nextToken = sr.Read();
			if (nextToken == '"') return new MemoryStream();
			//TODO: lazy init stream (more lightweight!?)
			var res = new ChunkedMemoryStream();
			var base64 = sr.LargeTempBuffer;
			int i = 1;
			base64[0] = (char)nextToken;
			int len;
			while ((len = sr.ReadUntil(base64, i, '"')) > 0)
			{
				i += len;
				if (i == base64.Length)
				{
					var bytes = Convert.FromBase64CharArray(base64, 0, base64.Length);
					res.Write(bytes, 0, bytes.Length);
					i = 0;
				}
			}
			nextToken = sr.Read();
			if (i > 0)
			{
				var bytes = Convert.FromBase64CharArray(base64, 0, i);
				res.Write(bytes, 0, bytes.Length);
			}
			if (nextToken != '"') throw new SerializationException("Expecting '\"' at position " + JsonSerialization.PositionInStream(sr) + ". Found end of stream.");
			return res;
		}