{"id":370,"date":"2021-01-13T08:45:05","date_gmt":"2021-01-13T08:45:05","guid":{"rendered":"https:\/\/michaeljohnsteiner.com\/?p=370"},"modified":"2021-01-19T10:50:53","modified_gmt":"2021-01-19T10:50:53","slug":"rawmemorystreamwriter-cs","status":"publish","type":"post","link":"https:\/\/michaeljohnsteiner.com\/index.php\/2021\/01\/13\/rawmemorystreamwriter-cs\/","title":{"rendered":"RawMemoryStreamWriter.cs"},"content":{"rendered":"\n<p>Writes Raw Interpreted Primitive Values to a Memory Stream <\/p>\n\n\n\n<p>It is not possible to recode the raw data stream once encoded, thus there is no RawMemoryStreamReader.<\/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.IO;\nusing System.Security;\nusing System.Text;\n[Serializable]\npublic class RawMemoryStreamWriter : IDisposable\n{\n    private readonly Encoder      _encoder;\n    private readonly Encoding     _encoding;\n    private          byte[]       _buffer;\n    private          MemoryStream _outStream;\n    public RawMemoryStreamWriter()\n    {\n        _outStream = new MemoryStream();\n        _buffer    = new byte[8];\n        _encoding  = new UTF8Encoding(false, true);\n        _encoder   = _encoding.GetEncoder();\n    }\n    public MemoryStream BaseStream\n    {\n        get\n        {\n            Flush();\n            return _outStream;\n        }\n    }\n    public void Dispose()\n    {\n        Dispose(true);\n    }\n    public void Close()\n    {\n        Dispose(true);\n    }\n    protected void Dispose(bool disposing)\n    {\n        if (!disposing)\n            return;\n        _outStream.Close();\n    }\n    public void Flush()\n    {\n        _outStream.Flush();\n    }\n    public long Seek(int offset, SeekOrigin origin)\n    {\n        return _outStream.Seek(offset, origin);\n    }\n    public void Write(object obj)\n    {\n        var ltype = obj.GetType();\n        switch (ltype.Name.Trim('[', ']'))\n        {\n            case \"Byte\":\n                if (!ltype.IsArray)\n                    Write((byte) obj);\n                else\n                    Write((byte[]) obj);\n                break;\n            case \"Boolean\":\n                if (!ltype.IsArray)\n                    Write((bool) obj);\n                else\n                    Write((bool[]) obj);\n                break;\n            case \"SByte\":\n                if (!ltype.IsArray)\n                    Write((sbyte) obj);\n                else\n                    Write((sbyte[]) obj);\n                break;\n            case \"Char\":\n                if (!ltype.IsArray)\n                    Write((char) obj);\n                else\n                    Write((char[]) obj);\n                break;\n            case \"Int16\":\n                if (!ltype.IsArray)\n                    Write((short) obj);\n                else\n                    Write((short[]) obj);\n                break;\n            case \"UInt16\":\n                if (!ltype.IsArray)\n                    Write((ushort) obj);\n                else\n                    Write((ushort[]) obj);\n                break;\n            case \"Int32\":\n                if (!ltype.IsArray)\n                    Write((int) obj);\n                else\n                    Write((int[]) obj);\n                break;\n            case \"UInt32\":\n                if (!ltype.IsArray)\n                    Write((uint) obj);\n                else\n                    Write((uint[]) obj);\n                break;\n            case \"Int64\":\n                if (!ltype.IsArray)\n                    Write((long) obj);\n                else\n                    Write((long[]) obj);\n                break;\n            case \"UInt64\":\n                if (!ltype.IsArray)\n                    Write((ulong) obj);\n                else\n                    Write((ulong[]) obj);\n                break;\n            case \"Single\":\n                if (!ltype.IsArray)\n                    Write((float) obj);\n                else\n                    Write((float[]) obj);\n                break;\n            case \"Double\":\n                if (!ltype.IsArray)\n                    Write((double) obj);\n                else\n                    Write((double[]) obj);\n                break;\n            case \"String\":\n                if (!ltype.IsArray)\n                    Write((string) obj);\n                else\n                    Write((string[]) obj);\n                break;\n            case \"Decimal\":\n                if (!ltype.IsArray)\n                    Write((decimal) obj);\n                else\n                    Write((decimal[]) obj);\n                break;\n            case \"DateTime\":\n                if (!ltype.IsArray)\n                    Write((DateTime) obj);\n                else\n                    Write((DateTime[]) obj);\n                break;\n        }\n    }\n    private void Write(bool value)\n    {\n        _buffer[0] = value ? (byte) 1 : (byte) 0;\n        _outStream.Write(_buffer, 0, 1);\n    }\n    private void Write(bool[] value)\n    {\n        for (var i = 0; i &lt; value.Length; ++i)\n        {\n            _buffer[0] = value[i] ? (byte) 1 : (byte) 0;\n            _outStream.Write(_buffer, 0, 1);\n        }\n    }\n    private void Write(byte value)\n    {\n        _outStream.WriteByte(value);\n    }\n    private void Write(sbyte value)\n    {\n        _outStream.WriteByte((byte) value);\n    }\n    private void Write(sbyte[] value)\n    {\n        for (var i = 0; i &lt; value.Length; ++i)\n            _outStream.WriteByte((byte) value[i]);\n    }\n    private void Write(byte[] buffer)\n    {\n        if (buffer == null)\n            throw new ArgumentNullException(nameof(buffer));\n        _outStream.Write(buffer, 0, buffer.Length);\n    }\n    private void Write(byte[] buffer, int index, int count)\n    {\n        _outStream.Write(buffer, index, count);\n    }\n    [SecuritySafeCritical]\n    private unsafe void Write(char ch)\n    {\n        int blen;\n        fixed (byte* bytes = _buffer)\n        {\n            blen = _encoder.GetBytes(&amp;ch, 1, bytes, _buffer.Length, true);\n        }\n        _outStream.Write(_buffer, 0, blen);\n    }\n    private void Write(char[] chars)\n    {\n        if (chars == null)\n            throw new ArgumentNullException(nameof(chars));\n        var bytes = _encoding.GetBytes(chars, 0, chars.Length);\n        _outStream.Write(bytes, 0, bytes.Length);\n    }\n    private void Write(char[] chars, int index, int count)\n    {\n        var bytes = _encoding.GetBytes(chars, index, count);\n        _outStream.Write(bytes, 0, bytes.Length);\n    }\n    [SecuritySafeCritical]\n    private unsafe void Write(double value)\n    {\n        var num = (ulong) *(long*) &amp;value;\n        _buffer[0] = (byte) num;\n        _buffer[1] = (byte) (num >> 8);\n        _buffer[2] = (byte) (num >> 16);\n        _buffer[3] = (byte) (num >> 24);\n        _buffer[4] = (byte) (num >> 32);\n        _buffer[5] = (byte) (num >> 40);\n        _buffer[6] = (byte) (num >> 48);\n        _buffer[7] = (byte) (num >> 56);\n        _outStream.Write(_buffer, 0, 8);\n    }\n    private void Write(double[] value)\n    {\n        for (var i = 0; i &lt; value.Length; ++i)\n            Write(value[i]);\n    }\n    private void Write(decimal value)\n    {\n        var bits  = decimal.GetBits(value);\n        var lo    = bits[0];\n        var mid   = bits[1];\n        var hi    = bits[2];\n        var flags = bits[3];\n        _buffer[0]  = (byte) lo;\n        _buffer[1]  = (byte) (lo >> 8);\n        _buffer[2]  = (byte) (lo >> 16);\n        _buffer[3]  = (byte) (lo >> 24);\n        _buffer[4]  = (byte) mid;\n        _buffer[5]  = (byte) (mid >> 8);\n        _buffer[6]  = (byte) (mid >> 16);\n        _buffer[7]  = (byte) (mid >> 24);\n        _buffer[8]  = (byte) hi;\n        _buffer[9]  = (byte) (hi >> 8);\n        _buffer[10] = (byte) (hi >> 16);\n        _buffer[11] = (byte) (hi >> 24);\n        _buffer[12] = (byte) flags;\n        _buffer[13] = (byte) (flags >> 8);\n        _buffer[14] = (byte) (flags >> 16);\n        _buffer[15] = (byte) (flags >> 24);\n        _outStream.Write(_buffer, 0, 16);\n    }\n    private void Write(decimal[] value)\n    {\n        for (var i = 0; i &lt; value.Length; ++i)\n            Write(value[i]);\n    }\n    private void Write(short value)\n    {\n        _buffer[0] = (byte) value;\n        _buffer[1] = (byte) ((uint) value >> 8);\n        _outStream.Write(_buffer, 0, 2);\n    }\n    private void Write(short[] value)\n    {\n        for (var i = 0; i &lt; value.Length; ++i)\n            Write(value[i]);\n    }\n    private void Write(ushort value)\n    {\n        _buffer[0] = (byte) value;\n        _buffer[1] = (byte) ((uint) value >> 8);\n        _outStream.Write(_buffer, 0, 2);\n    }\n    private void Write(ushort[] value)\n    {\n        for (var i = 0; i &lt; value.Length; ++i)\n            Write(value[i]);\n    }\n    private void Write(int value)\n    {\n        _buffer[0] = (byte) value;\n        _buffer[1] = (byte) (value >> 8);\n        _buffer[2] = (byte) (value >> 16);\n        _buffer[3] = (byte) (value >> 24);\n        _outStream.Write(_buffer, 0, 4);\n    }\n    private void Write(int[] value)\n    {\n        for (var i = 0; i &lt; value.Length; ++i)\n            Write(value[i]);\n    }\n    private void Write(uint value)\n    {\n        _buffer[0] = (byte) value;\n        _buffer[1] = (byte) (value >> 8);\n        _buffer[2] = (byte) (value >> 16);\n        _buffer[3] = (byte) (value >> 24);\n        _outStream.Write(_buffer, 0, 4);\n    }\n    private void Write(uint[] value)\n    {\n        for (var i = 0; i &lt; value.Length; ++i)\n            Write(value[i]);\n    }\n    private void Write(long value)\n    {\n        _buffer[0] = (byte) value;\n        _buffer[1] = (byte) (value >> 8);\n        _buffer[2] = (byte) (value >> 16);\n        _buffer[3] = (byte) (value >> 24);\n        _buffer[4] = (byte) (value >> 32);\n        _buffer[5] = (byte) (value >> 40);\n        _buffer[6] = (byte) (value >> 48);\n        _buffer[7] = (byte) (value >> 56);\n        _outStream.Write(_buffer, 0, 8);\n    }\n    private void Write(long[] value)\n    {\n        for (var i = 0; i &lt; value.Length; ++i)\n            Write(value[i]);\n    }\n    private void Write(ulong value)\n    {\n        _buffer[0] = (byte) value;\n        _buffer[1] = (byte) (value >> 8);\n        _buffer[2] = (byte) (value >> 16);\n        _buffer[3] = (byte) (value >> 24);\n        _buffer[4] = (byte) (value >> 32);\n        _buffer[5] = (byte) (value >> 40);\n        _buffer[6] = (byte) (value >> 48);\n        _buffer[7] = (byte) (value >> 56);\n        _outStream.Write(_buffer, 0, 8);\n    }\n    private void Write(ulong[] value)\n    {\n        for (var i = 0; i &lt; value.Length; ++i)\n            Write(value[i]);\n    }\n    [SecuritySafeCritical]\n    private unsafe void Write(float value)\n    {\n        var num = *(uint*) &amp;value;\n        _buffer[0] = (byte) num;\n        _buffer[1] = (byte) (num >> 8);\n        _buffer[2] = (byte) (num >> 16);\n        _buffer[3] = (byte) (num >> 24);\n        _outStream.Write(_buffer, 0, 4);\n    }\n    private void Write(float[] value)\n    {\n        for (var i = 0; i &lt; value.Length; ++i)\n            Write(value[i]);\n    }\n    [SecuritySafeCritical]\n    private void Write(string value)\n    {\n        int count;\n        if (value != null)\n            count = _encoding.GetByteCount(value);\n        else\n            throw new Exception(\"Value cannot be null\");\n        var LBuffer = new byte[count];\n        _encoding.GetBytes(value, 0, value.Length, LBuffer, 0);\n        _outStream.Write(LBuffer, 0, count);\n    }\n    private void Write(string[] value)\n    {\n        for (var i = 0; i &lt; value.Length; ++i)\n            Write(value[i]);\n    }\n    private unsafe void Write(DateTime value)\n    {\n        var numArray = new byte[8];\n        fixed (byte* ptr = numArray)\n        {\n            *(long*) ptr = value.Ticks;\n        }\n        _buffer[0] = numArray[0];\n        _buffer[1] = numArray[1];\n        _buffer[2] = numArray[2];\n        _buffer[3] = numArray[3];\n        _buffer[4] = numArray[4];\n        _buffer[5] = numArray[5];\n        _buffer[6] = numArray[6];\n        _buffer[7] = numArray[7];\n        _outStream.Write(_buffer, 0, 8);\n    }\n    private void Write(DateTime[] value)\n    {\n        for (var i = 0; i &lt; value.Length; ++i)\n            Write(value[i]);\n    }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Writes Raw Interpreted Primitive Values to a Memory Stream It is not possible to recode the raw data stream once encoded, thus there is no RawMemoryStreamReader.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[],"_links":{"self":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/370"}],"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=370"}],"version-history":[{"count":2,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/370\/revisions"}],"predecessor-version":[{"id":376,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/370\/revisions\/376"}],"wp:attachment":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/media?parent=370"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/categories?post=370"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/tags?post=370"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}