MemoryStreamReader.cs

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