{"id":62,"date":"2020-06-10T04:54:27","date_gmt":"2020-06-10T04:54:27","guid":{"rendered":"https:\/\/michaeljohnsteiner.com\/?p=62"},"modified":"2020-06-11T04:39:08","modified_gmt":"2020-06-11T04:39:08","slug":"writer-cs","status":"publish","type":"post","link":"https:\/\/michaeljohnsteiner.com\/index.php\/2020\/06\/10\/writer-cs\/","title":{"rendered":"Writer.cs"},"content":{"rendered":"\n<p>Simplified Binary Writer<\/p>\n\n\n\n<p>Example Code:<\/p>\n\n\n\n<figure class=\"wp-block-embed-wordpress wp-block-embed is-type-wp-embed is-provider-michaeljohnsteiner-com\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"UMkuEY0PWD\"><a href=\"https:\/\/michaeljohnsteiner.com\/index.php\/2020\/06\/05\/chisquaredimagecomparison-cs\/\">ChiSquaredImageComparison.cs<\/a><\/blockquote><iframe title=\"&#8220;ChiSquaredImageComparison.cs&#8221; &#8212; MichaelJohnSteiner.com\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" src=\"https:\/\/michaeljohnsteiner.com\/index.php\/2020\/06\/05\/chisquaredimagecomparison-cs\/embed\/#?secret=UMkuEY0PWD\" data-secret=\"UMkuEY0PWD\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\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.Numerics;\nusing System.Text;\n\/\/\/ &lt;inheritdoc \/>\n\/\/\/ &lt;summary>\n\/\/\/     Alternate Binary Writer created to enhance usability and ease coding complexity.\n\/\/\/ &lt;\/summary>\npublic class Writer : IDisposable\n{\n    \/\/\/ &lt;inheritdoc \/>\n    \/\/\/ &lt;summary>\n    \/\/\/     Initializes a new instance of the Writer class based on a specified path name, a default FileMode of Create, and\n    \/\/\/     defaulting to UTF-8 encoding.\n    \/\/\/ &lt;\/summary>\n    public Writer(string path) : this(path, FileMode.Create, new UTF8Encoding(false, true))\n    {\n    }\n    \/\/\/ &lt;inheritdoc \/>\n    \/\/\/ &lt;summary>\n    \/\/\/     Initializes a new instance of the Writer class based on a specified path name, a specified FileMode and defaulting\n    \/\/\/     to UTF-8 encoding.\n    \/\/\/ &lt;\/summary>\n    public Writer(string path, FileMode fm) : this(path, fm, new UTF8Encoding(false, true))\n    {\n    }\n    \/\/\/ &lt;summary>\n    \/\/\/     Initializes a new instance of the Writer class based on a specified path name, a specified FileMode and a specified\n    \/\/\/     encoding.\n    \/\/\/ &lt;\/summary>\n    public Writer(string path, FileMode fm, Encoding encoding)\n    {\n        if (string.IsNullOrEmpty(path))\n            throw new Exception($\"Path {path} cannot be null or empty.\");\n        BaseMode = fm;\n        try\n        {\n            if (File.Exists(path))\n                File.SetAttributes(path, File.GetAttributes(path) | FileAttributes.Normal);\n            BaseStream = new FileStream(path, BaseMode, FileAccess.Write);\n            if (BaseStream?.CanWrite == true)\n                BaseWriter = new BinaryWriter(BaseStream, encoding, true);\n            else throw new Exception($\"The FileStream for path:{path} is null.\");\n        }\n        catch (Exception e)\n        {\n            throw new Exception($\"Error: {e.Message}\");\n        }\n    }\n    public Writer(Stream stream) : this(stream, new UTF8Encoding(false, true))\n    {\n    }\n    public Writer(Stream strm, Encoding encoding)\n    {\n        try\n        {\n            if (strm?.CanWrite == true)\n                BaseWriter = new BinaryWriter(strm, encoding, true);\n            else throw new Exception(\"The Stream is null.\");\n        }\n        catch (Exception e)\n        {\n            throw new Exception($\"Error: {e.Message}\");\n        }\n    }\n    \/\/\/ &lt;summary>\n    \/\/\/     Expose the underlying BinaryWriter\n    \/\/\/ &lt;\/summary>\n    public BinaryWriter BaseWriter { get; }\n    \/\/\/ &lt;summary>\n    \/\/\/     Expose the underlying FileMode\n    \/\/\/ &lt;\/summary>\n    public FileMode BaseMode { get; }\n    \/\/\/ &lt;summary>\n    \/\/\/     Expose the underlying FileStream\n    \/\/\/ &lt;\/summary>\n    public FileStream BaseStream { get; }\n    \/\/\/ &lt;summary>\n    \/\/\/     Each time a primitive is written there is one additional integer written to signify its type.\n    \/\/\/     This can be used to compute the final size of the stream bytes needed.\n    \/\/\/ &lt;\/summary>\n    public static int PrimitiveOverHead => sizeof(int);\n    \/\/\/ &lt;summary>\n    \/\/\/     Each time a array is written there are two additional integers written one to signify its type and the other its\n    \/\/\/     size.\n    \/\/\/     This can be used to compute the final size of the stream bytes needed.\n    \/\/\/ &lt;\/summary>\n    public static int ArrayOverHead => sizeof(int) * 2;\n    public void Dispose()\n    {\n        if (BaseStream == null) return;\n        BaseStream.Flush();\n        BaseStream.Dispose();\n    }\n    \/\/\/ &lt;summary>\n    \/\/\/     Sets the position to offset relative to origin within the stream.\n    \/\/\/ &lt;\/summary>\n    public long Seek(int offset, SeekOrigin origin)\n    {\n        return BaseStream.Seek(offset, origin);\n    }\n    public void WriteBool(bool value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.Boolean);\n        BaseWriter.Write(value);\n    }\n    public void WriteChar(char value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.Character);\n        BaseWriter.Write(value);\n    }\n    public void WriteByte(byte value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.Byte);\n        BaseWriter.Write(value);\n    }\n    public void WriteSByte(sbyte value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.ShortByte);\n        BaseWriter.Write(value);\n    }\n    public void WriteShort(short value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.Short);\n        BaseWriter.Write(value);\n    }\n    public void WriteUShort(ushort value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.UnsignedShort);\n        BaseWriter.Write(value);\n    }\n    public void WriteInt(int value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.Integer);\n        BaseWriter.Write(value);\n    }\n    public void WriteUInt(uint value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.UnsignedInteger);\n        BaseWriter.Write(value);\n    }\n    public void WriteLOng(long value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.Long);\n        BaseWriter.Write(value);\n    }\n    public void WriteULong(ulong value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.UnsignedLong);\n        BaseWriter.Write(value);\n    }\n    public void WriteString(string value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.String);\n        BaseWriter.Write(value);\n    }\n    public void WriteFloat(float value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.Float);\n        BaseWriter.Write(value);\n    }\n    public void WriteDouble(double value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.Double);\n        BaseWriter.Write(value);\n    }\n    public void WriteDecimal(decimal value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.Decimal);\n        BaseWriter.Write(value);\n    }\n    public void WriteBigInteger(BigInteger value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.BigInteger);\n        WriteBytes(value.ToByteArray());\n    }\n    public void WriteBigRational(BigRational value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.BigRational);\n        var Num = value.Numerator.ToByteArray();\n        var Den = value.Denominator.ToByteArray();\n        WriteBytes(Num);\n        WriteBytes(Den);\n    }\n    public void WriteBools(bool[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.BooleanArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            BaseWriter.Write(v);\n    }\n    public void WriteChars(char[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.CharacterArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            BaseWriter.Write(v);\n    }\n    public void WriteBytes(byte[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.ByteArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            BaseWriter.Write(v);\n    }\n    public void WriteSBytes(sbyte[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.ShortByteArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            BaseWriter.Write(v);\n    }\n    public void WriteShorts(short[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.ShortArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            BaseWriter.Write(v);\n    }\n    public void WriteUShorts(ushort[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.UnsignedShortArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            BaseWriter.Write(v);\n    }\n    public void WriteInts(int[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.IntegerArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            BaseWriter.Write(v);\n    }\n    public void WriteUInts(uint[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.UnsignedIntegerArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            BaseWriter.Write(v);\n    }\n    public void WriteLongs(long[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.LongArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            BaseWriter.Write(v);\n    }\n    public void WriteULongs(ulong[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.UnsignedLongArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            BaseWriter.Write(v);\n    }\n    public void WriteStrings(string[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.StringArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            BaseWriter.Write(v);\n    }\n    public void WriteFloats(float[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.FloatArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            BaseWriter.Write(v);\n    }\n    public void WriteDoubles(double[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.DoubleArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            BaseWriter.Write(v);\n    }\n    public void WriteDecimals(decimal[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.DecimalArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            BaseWriter.Write(v);\n    }\n    public void WriteBigIntegers(BigInteger[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.BigIntegerArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            WriteBigInteger(v);\n    }\n    public void WriteBigRationals(BigRational[] value)\n    {\n        BaseWriter.Write((int) Rwtypes.Readerwritertypes.BigRationalArray);\n        var len = value.Length;\n        BaseWriter.Write(len);\n        foreach (var v in value)\n            WriteBigRational(v);\n    }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Simplified Binary Writer Example Code:<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[6,5,7],"_links":{"self":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/62"}],"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=62"}],"version-history":[{"count":3,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/62\/revisions"}],"predecessor-version":[{"id":65,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/62\/revisions\/65"}],"wp:attachment":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/media?parent=62"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/categories?post=62"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/tags?post=62"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}