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