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