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