MemoryStream Reader Class
using System; using System.Collections.Generic; using System.IO; using System.Numerics; using System.Text; public class MemoryStreamReader : IDisposable { public static string[] Readerwritertypes = { "BOOLN ", //0 "CHAR ", //1 "BYTE ", //2 "SBYTE ", //3 "SHORT ", //4 "USHORT ", //5 "INTEGER ", //6 "UINTEGER ", //7 "LONG ", //8 "ULONG ", //9 "STRING ", //10 "FLOAT ", //11 "DOUBLE ", //12 "DECIMAL ", //13 "BOOLARRY ", //14 "CHARARRY ", //15 "BYTEARRY ", //16 "SBYTEARRY ", //17 "SHORTARRY ", //18 "USHORTARRY ", //19 "INTARRY ", //20 "UINTARRY ", //21 "LONGARRY ", //22 "ULONGARRY ", //23 "STRINGARRY ", //24 "FLOATARRY ", //25 "DOUBLEARRY ", //26 "DECIMALARRY ", //27 "BIGINTEGER ", //28 "BIGINTARRY ", //29 "BIGRATIONAL ", //30 "BIGRATARRY ", //31 "DATETIME ", //32 "DATETIMEARRY", //33 "REFVALUETYPE" //34 }; private readonly Decoder _decoder; private readonly Encoder _encoder; private readonly Encoding _encoding; public MemoryStreamReader() : this(null, new UTF8Encoding(false, true)) { } public MemoryStreamReader(Stream input) : this(input, new UTF8Encoding()) { } public MemoryStreamReader(Stream input, Encoding encoding) { if (input == null) { BaseStream = new MemoryStream(); } else { BaseStream = input; BaseStream.Position = 0; } if (encoding == null) _encoding = new UTF8Encoding(false, true); else _encoding = encoding; _encoder = _encoding.GetEncoder(); _decoder = _encoding.GetDecoder(); } public Stream BaseStream { get; set; } private bool IsUnicode => _encoding is UnicodeEncoding; public void Dispose() { Dispose(true); } public void Close() { Dispose(true); } protected virtual void Dispose(bool disposing) { if (disposing) BaseStream.Close(); BaseStream = null; } public IEnumerable<object> GetDataList() { var list = new List<object>(); while (true) { var obj = Read(); if (obj == null) break; list.Add(obj); } return list; } public KeyValuePair<string, object>[] GetDataKP() { var kpl = new List<KeyValuePair<string, object>>(); while (true) { var obj = Read(); if (obj == null) break; kpl.Add(new KeyValuePair<string, object>(obj.GetType().Name, obj)); } return kpl.ToArray(); } public object Read() { var head = GetNextHeader(); if (head == null) return null; if (head.IndexOf(Readerwritertypes[0], StringComparison.Ordinal) != -1) { var vbuf = new byte[1]; BaseStream.Read(vbuf, 0, 1); var obj = BitConverter.ToBoolean(vbuf, 0); return obj; } if (head.IndexOf(Readerwritertypes[1], StringComparison.Ordinal) != -1) { var cl = IsUnicode ? 2 : 1; var vbuf = new byte[cl]; BaseStream.Read(vbuf, 0, cl); var obj = _encoding.GetString(vbuf).ToCharArray()[0]; return obj; } if (head.IndexOf(Readerwritertypes[2], StringComparison.Ordinal) != -1) { var vbuf = new byte[1]; BaseStream.Read(vbuf, 0, 1); return vbuf; } if (head.IndexOf(Readerwritertypes[3], StringComparison.Ordinal) != -1) { var vbuf = new byte[1]; BaseStream.Read(vbuf, 0, 1); return (sbyte) vbuf[0]; } if (head.IndexOf(Readerwritertypes[4], StringComparison.Ordinal) != -1) { var vbuf = new byte[2]; BaseStream.Read(vbuf, 0, 2); var obj = BitConverter.ToInt16(vbuf, 0); return obj; } if (head.IndexOf(Readerwritertypes[5], StringComparison.Ordinal) != -1) { var vbuf = new byte[2]; BaseStream.Read(vbuf, 0, 2); var obj = BitConverter.ToUInt16(vbuf, 0); return obj; } if (head.IndexOf(Readerwritertypes[6], StringComparison.Ordinal) != -1) { var vbuf = new byte[4]; BaseStream.Read(vbuf, 0, 4); var obj = BitConverter.ToInt32(vbuf, 0); return obj; } if (head.IndexOf(Readerwritertypes[7], StringComparison.Ordinal) != -1) { var vbuf = new byte[4]; BaseStream.Read(vbuf, 0, 4); var obj = BitConverter.ToUInt32(vbuf, 0); return obj; } if (head.IndexOf(Readerwritertypes[8], StringComparison.Ordinal) != -1) { var vbuf = new byte[8]; BaseStream.Read(vbuf, 0, 8); var obj = BitConverter.ToInt64(vbuf, 0); return obj; } if (head.IndexOf(Readerwritertypes[9], StringComparison.Ordinal) != -1) { var vbuf = new byte[8]; BaseStream.Read(vbuf, 0, 8); var obj = BitConverter.ToUInt64(vbuf, 0); return obj; } if (head.IndexOf(Readerwritertypes[10], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var obj = _encoding.GetString(vbuf); return obj; } if (head.IndexOf(Readerwritertypes[11], StringComparison.Ordinal) != -1) { var vbuf = new byte[4]; BaseStream.Read(vbuf, 0, 4); var obj = BitConverter.ToSingle(vbuf, 0); return obj; } if (head.IndexOf(Readerwritertypes[12], StringComparison.Ordinal) != -1) { var vbuf = new byte[8]; BaseStream.Read(vbuf, 0, 8); var obj = BitConverter.ToDouble(vbuf, 0); return obj; } if (head.IndexOf(Readerwritertypes[13], StringComparison.Ordinal) != -1) { var vbuf = new byte[16]; BaseStream.Read(vbuf, 0, 16); var obj = vbuf.ToDecimal(); return obj; } if (head.IndexOf(Readerwritertypes[28], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var obj = new BigInteger(vbuf); return obj; } if (head.IndexOf(Readerwritertypes[30], StringComparison.Ordinal) != -1) { var nlbuf = new byte[4]; BaseStream.Read(nlbuf, 0, 4); var nlen = nlbuf.ToInt(); var nbuf = new byte[nlen]; BaseStream.Read(nbuf, 0, nlen); var dlbuf = new byte[4]; BaseStream.Read(dlbuf, 0, 4); var dlen = dlbuf.ToInt(); var dbuf = new byte[dlen]; BaseStream.Read(dbuf, 0, dlen); var obj = new BigRational(new BigInteger(nbuf), new BigInteger(dbuf)); return obj; } if (head.IndexOf(Readerwritertypes[32], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var ll = BitConverter.ToInt64(vbuf, 0); var obj = DateTime.FromBinary(ll); return obj; } if (head.IndexOf(Readerwritertypes[34], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var obj = vbuf.ByteArrayToObject(); return obj; } ////start the array section tomorrow ** MJS ** Snow tonight and tomorrow 9 inches? BULL maybe 4 ** MJS ** 01/15/21 if (head.IndexOf(Readerwritertypes[14], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var obj = vbuf.ToBooleanArray(); return obj; } if (head.IndexOf(Readerwritertypes[15], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var obj = _encoding.GetString(vbuf).ToCharArray(); return obj; } if (head.IndexOf(Readerwritertypes[16], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); return vbuf; } if (head.IndexOf(Readerwritertypes[17], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); return (sbyte[]) vbuf.Clone(); } if (head.IndexOf(Readerwritertypes[18], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var obj = vbuf.ToShortArray(); return obj; } if (head.IndexOf(Readerwritertypes[19], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var obj = vbuf.ToUShortArray(); return obj; } if (head.IndexOf(Readerwritertypes[20], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var obj = vbuf.ToIntArray(); return obj; } if (head.IndexOf(Readerwritertypes[21], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var obj = vbuf.ToUIntArray(); return obj; } if (head.IndexOf(Readerwritertypes[22], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var obj = vbuf.ToLongArray(); return obj; } if (head.IndexOf(Readerwritertypes[23], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var obj = vbuf.ToULongArray(); return obj; } if (head.IndexOf(Readerwritertypes[23], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var obj = vbuf.ToULongArray(); return obj; } if (head.IndexOf(Readerwritertypes[24], StringComparison.Ordinal) != -1) { var albuf = new byte[4]; BaseStream.Read(albuf, 0, 4); var alen = albuf.ToInt(); var rstr = new string[alen]; for (var i = 0; i < alen; ++i) { var slbuf = new byte[4]; BaseStream.Read(slbuf, 0, 4); var slen = slbuf.ToInt(); var sbuf = new byte[slen]; var str = _encoding.GetString(sbuf, 0, slen); rstr[i] = str; } return rstr; } if (head.IndexOf(Readerwritertypes[25], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var obj = vbuf.ToFloatArray(); return obj; } if (head.IndexOf(Readerwritertypes[26], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var obj = vbuf.ToDoubleArray(); return obj; } if (head.IndexOf(Readerwritertypes[27], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var vbuf = new byte[len]; BaseStream.Read(vbuf, 0, len); var obj = vbuf.ToDecimalArray(); return obj; } if (head.IndexOf(Readerwritertypes[29], StringComparison.Ordinal) != -1) { var lbuf = new byte[4]; BaseStream.Read(lbuf, 0, 4); var len = lbuf.ToInt(); var objr = new BigInteger[len]; for (var i = 0; i < len; ++i) { var ilb = new byte[4]; BaseStream.Read(ilb, 0, 4); var blen = lbuf.ToInt(); var vbuf = new byte[blen]; BaseStream.Read(vbuf, 0, len); objr[i] = new BigInteger(vbuf); } return objr; } return null; } private string GetNextHeader() { if (PeekChar() != -1) { var buf = new byte[Readerwritertypes[0].Length]; BaseStream.Read(buf, 0, buf.Length); var head = _encoding.GetString(buf); return head; } return null; } public int PeekChar() { if (BaseStream == null) throw new Exception("Input Stream is Null"); if (!BaseStream.CanSeek) return -1; var position = BaseStream.Position; var coec = ReadOne(); BaseStream.Position = position; return coec; } private int ReadOne() { if (BaseStream == null) throw new Exception("Input Stream is Null"); var bytes = new byte[IsUnicode ? 2 : 1]; var sc = new char[1]; var br = _decoder.GetChars(bytes, 0, bytes.Length, sc, 0); return br == 0 ? -1 : sc[0]; } }