{"id":374,"date":"2021-01-19T10:40:38","date_gmt":"2021-01-19T10:40:38","guid":{"rendered":"https:\/\/michaeljohnsteiner.com\/?p=374"},"modified":"2021-01-19T10:40:38","modified_gmt":"2021-01-19T10:40:38","slug":"memorystreamreader-cs","status":"publish","type":"post","link":"https:\/\/michaeljohnsteiner.com\/index.php\/2021\/01\/19\/memorystreamreader-cs\/","title":{"rendered":"MemoryStreamReader.cs"},"content":{"rendered":"\n<p>MemoryStream Reader Class<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Numerics;\nusing System.Text;\npublic class MemoryStreamReader : IDisposable\n{\n    public static string[] Readerwritertypes =\n    {\n        \"BOOLN       \", \/\/0\n        \"CHAR        \", \/\/1\n        \"BYTE        \", \/\/2\n        \"SBYTE       \", \/\/3\n        \"SHORT       \", \/\/4\n        \"USHORT      \", \/\/5\n        \"INTEGER     \", \/\/6\n        \"UINTEGER    \", \/\/7\n        \"LONG        \", \/\/8\n        \"ULONG       \", \/\/9\n        \"STRING      \", \/\/10\n        \"FLOAT       \", \/\/11\n        \"DOUBLE      \", \/\/12\n        \"DECIMAL     \", \/\/13\n        \"BOOLARRY    \", \/\/14\n        \"CHARARRY    \", \/\/15\n        \"BYTEARRY    \", \/\/16\n        \"SBYTEARRY   \", \/\/17\n        \"SHORTARRY   \", \/\/18\n        \"USHORTARRY  \", \/\/19\n        \"INTARRY     \", \/\/20\n        \"UINTARRY    \", \/\/21\n        \"LONGARRY    \", \/\/22\n        \"ULONGARRY   \", \/\/23\n        \"STRINGARRY  \", \/\/24\n        \"FLOATARRY   \", \/\/25\n        \"DOUBLEARRY  \", \/\/26\n        \"DECIMALARRY \", \/\/27\n        \"BIGINTEGER  \", \/\/28\n        \"BIGINTARRY  \", \/\/29\n        \"BIGRATIONAL \", \/\/30\n        \"BIGRATARRY  \", \/\/31\n        \"DATETIME    \", \/\/32\n        \"DATETIMEARRY\", \/\/33\n        \"REFVALUETYPE\"  \/\/34\n    };\n    private readonly Decoder  _decoder;\n    private readonly Encoder  _encoder;\n    private readonly Encoding _encoding;\n    public MemoryStreamReader() : this(null, new UTF8Encoding(false, true))\n    {\n    }\n    public MemoryStreamReader(Stream input) : this(input, new UTF8Encoding())\n    {\n    }\n    public MemoryStreamReader(Stream input, Encoding encoding)\n    {\n        if (input == null)\n        {\n            BaseStream = new MemoryStream();\n        }\n        else\n        {\n            BaseStream          = input;\n            BaseStream.Position = 0;\n        }\n        if (encoding == null)\n            _encoding = new UTF8Encoding(false, true);\n        else\n            _encoding = encoding;\n        _encoder = _encoding.GetEncoder();\n        _decoder = _encoding.GetDecoder();\n    }\n    public Stream BaseStream\n    {\n        get;\n        set;\n    }\n    private bool IsUnicode => _encoding is UnicodeEncoding;\n    public void Dispose()\n    {\n        Dispose(true);\n    }\n    public void Close()\n    {\n        Dispose(true);\n    }\n    protected virtual void Dispose(bool disposing)\n    {\n        if (disposing)\n            BaseStream.Close();\n        BaseStream = null;\n    }\n    public IEnumerable&lt;object> GetDataList()\n    {\n        var list = new List&lt;object>();\n        while (true)\n        {\n            var obj = Read();\n            if (obj == null)\n                break;\n            list.Add(obj);\n        }\n        return list;\n    }\n    public KeyValuePair&lt;string, object>[] GetDataKP()\n    {\n        var kpl = new List&lt;KeyValuePair&lt;string, object>>();\n        while (true)\n        {\n            var obj = Read();\n            if (obj == null)\n                break;\n            kpl.Add(new KeyValuePair&lt;string, object>(obj.GetType().Name, obj));\n        }\n        return kpl.ToArray();\n    }\n    public object Read()\n    {\n        var head = GetNextHeader();\n        if (head == null)\n            return null;\n        if (head.IndexOf(Readerwritertypes[0], StringComparison.Ordinal) != -1)\n        {\n            var vbuf = new byte[1];\n            BaseStream.Read(vbuf, 0, 1);\n            var obj = BitConverter.ToBoolean(vbuf, 0);\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[1], StringComparison.Ordinal) != -1)\n        {\n            var cl   = IsUnicode ? 2 : 1;\n            var vbuf = new byte[cl];\n            BaseStream.Read(vbuf, 0, cl);\n            var obj = _encoding.GetString(vbuf).ToCharArray()[0];\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[2], StringComparison.Ordinal) != -1)\n        {\n            var vbuf = new byte[1];\n            BaseStream.Read(vbuf, 0, 1);\n            return vbuf;\n        }\n        if (head.IndexOf(Readerwritertypes[3], StringComparison.Ordinal) != -1)\n        {\n            var vbuf = new byte[1];\n            BaseStream.Read(vbuf, 0, 1);\n            return (sbyte) vbuf[0];\n        }\n        if (head.IndexOf(Readerwritertypes[4], StringComparison.Ordinal) != -1)\n        {\n            var vbuf = new byte[2];\n            BaseStream.Read(vbuf, 0, 2);\n            var obj = BitConverter.ToInt16(vbuf, 0);\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[5], StringComparison.Ordinal) != -1)\n        {\n            var vbuf = new byte[2];\n            BaseStream.Read(vbuf, 0, 2);\n            var obj = BitConverter.ToUInt16(vbuf, 0);\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[6], StringComparison.Ordinal) != -1)\n        {\n            var vbuf = new byte[4];\n            BaseStream.Read(vbuf, 0, 4);\n            var obj = BitConverter.ToInt32(vbuf, 0);\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[7], StringComparison.Ordinal) != -1)\n        {\n            var vbuf = new byte[4];\n            BaseStream.Read(vbuf, 0, 4);\n            var obj = BitConverter.ToUInt32(vbuf, 0);\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[8], StringComparison.Ordinal) != -1)\n        {\n            var vbuf = new byte[8];\n            BaseStream.Read(vbuf, 0, 8);\n            var obj = BitConverter.ToInt64(vbuf, 0);\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[9], StringComparison.Ordinal) != -1)\n        {\n            var vbuf = new byte[8];\n            BaseStream.Read(vbuf, 0, 8);\n            var obj = BitConverter.ToUInt64(vbuf, 0);\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[10], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var obj = _encoding.GetString(vbuf);\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[11], StringComparison.Ordinal) != -1)\n        {\n            var vbuf = new byte[4];\n            BaseStream.Read(vbuf, 0, 4);\n            var obj = BitConverter.ToSingle(vbuf, 0);\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[12], StringComparison.Ordinal) != -1)\n        {\n            var vbuf = new byte[8];\n            BaseStream.Read(vbuf, 0, 8);\n            var obj = BitConverter.ToDouble(vbuf, 0);\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[13], StringComparison.Ordinal) != -1)\n        {\n            var vbuf = new byte[16];\n            BaseStream.Read(vbuf, 0, 16);\n            var obj = vbuf.ToDecimal();\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[28], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var obj = new BigInteger(vbuf);\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[30], StringComparison.Ordinal) != -1)\n        {\n            var nlbuf = new byte[4];\n            BaseStream.Read(nlbuf, 0, 4);\n            var nlen = nlbuf.ToInt();\n            var nbuf = new byte[nlen];\n            BaseStream.Read(nbuf, 0, nlen);\n            var dlbuf = new byte[4];\n            BaseStream.Read(dlbuf, 0, 4);\n            var dlen = dlbuf.ToInt();\n            var dbuf = new byte[dlen];\n            BaseStream.Read(dbuf, 0, dlen);\n            var obj = new BigRational(new BigInteger(nbuf), new BigInteger(dbuf));\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[32], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var ll  = BitConverter.ToInt64(vbuf, 0);\n            var obj = DateTime.FromBinary(ll);\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[34], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var obj = vbuf.ByteArrayToObject();\n            return obj;\n        }\n\n        \/\/\/\/start the array section tomorrow ** MJS ** Snow tonight and tomorrow 9 inches? BULL maybe 4 ** MJS ** 01\/15\/21\n        if (head.IndexOf(Readerwritertypes[14], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var obj = vbuf.ToBooleanArray();\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[15], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var obj = _encoding.GetString(vbuf).ToCharArray();\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[16], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            return vbuf;\n        }\n        if (head.IndexOf(Readerwritertypes[17], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            return (sbyte[]) vbuf.Clone();\n        }\n        if (head.IndexOf(Readerwritertypes[18], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var obj = vbuf.ToShortArray();\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[19], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var obj = vbuf.ToUShortArray();\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[20], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var obj = vbuf.ToIntArray();\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[21], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var obj = vbuf.ToUIntArray();\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[22], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var obj = vbuf.ToLongArray();\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[23], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var obj = vbuf.ToULongArray();\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[23], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var obj = vbuf.ToULongArray();\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[24], StringComparison.Ordinal) != -1)\n        {\n            var albuf = new byte[4];\n            BaseStream.Read(albuf, 0, 4);\n            var alen = albuf.ToInt();\n            var rstr = new string[alen];\n            for (var i = 0; i &lt; alen; ++i)\n            {\n                var slbuf = new byte[4];\n                BaseStream.Read(slbuf, 0, 4);\n                var slen = slbuf.ToInt();\n                var sbuf = new byte[slen];\n                var str  = _encoding.GetString(sbuf, 0, slen);\n                rstr[i] = str;\n            }\n            return rstr;\n        }\n        if (head.IndexOf(Readerwritertypes[25], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var obj = vbuf.ToFloatArray();\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[26], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var obj = vbuf.ToDoubleArray();\n            return obj;\n        }\n        if (head.IndexOf(Readerwritertypes[27], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var vbuf = new byte[len];\n            BaseStream.Read(vbuf, 0, len);\n            var obj = vbuf.ToDecimalArray();\n            return obj;\n        }\n\n        if (head.IndexOf(Readerwritertypes[29], StringComparison.Ordinal) != -1)\n        {\n            var lbuf = new byte[4];\n            BaseStream.Read(lbuf, 0, 4);\n            var len  = lbuf.ToInt();\n            var objr = new BigInteger[len];\n\n            for (var i = 0; i &lt; len; ++i)\n            {\n                var ilb = new byte[4];\n                BaseStream.Read(ilb, 0, 4);\n                var blen = lbuf.ToInt();\n\n\n                var vbuf = new byte[blen];\n                BaseStream.Read(vbuf, 0, len);\n                objr[i] = new BigInteger(vbuf);\n            }\n            return objr;\n        }\n        return null;\n    }\n    private string GetNextHeader()\n    {\n        if (PeekChar() != -1)\n        {\n            var buf = new byte[Readerwritertypes[0].Length];\n            BaseStream.Read(buf, 0, buf.Length);\n            var head = _encoding.GetString(buf);\n            return head;\n        }\n        return null;\n    }\n    public int PeekChar()\n    {\n        if (BaseStream == null)\n            throw new Exception(\"Input Stream is Null\");\n        if (!BaseStream.CanSeek)\n            return -1;\n        var position = BaseStream.Position;\n        var coec     = ReadOne();\n        BaseStream.Position = position;\n        return coec;\n    }\n    private int ReadOne()\n    {\n        if (BaseStream == null)\n            throw new Exception(\"Input Stream is Null\");\n        var bytes = new byte[IsUnicode ? 2 : 1];\n        var sc    = new char[1];\n        var br    = _decoder.GetChars(bytes, 0, bytes.Length, sc, 0);\n        return br == 0 ? -1 : sc[0];\n    }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>MemoryStream Reader Class<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[168,170],"_links":{"self":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/374"}],"collection":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/comments?post=374"}],"version-history":[{"count":1,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/374\/revisions"}],"predecessor-version":[{"id":375,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/374\/revisions\/375"}],"wp:attachment":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/media?parent=374"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/categories?post=374"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/tags?post=374"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}