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.
using System;
using System.IO;
using System.Security;
using System.Text;
[Serializable]
public class RawMemoryStreamWriter : IDisposable
{
private readonly Encoder _encoder;
private readonly Encoding _encoding;
private byte[] _buffer;
private MemoryStream _outStream;
public RawMemoryStreamWriter()
{
_outStream = new MemoryStream();
_buffer = new byte[8];
_encoding = new UTF8Encoding(false, true);
_encoder = _encoding.GetEncoder();
}
public MemoryStream BaseStream
{
get
{
Flush();
return _outStream;
}
}
public void Dispose()
{
Dispose(true);
}
public void Close()
{
Dispose(true);
}
protected void Dispose(bool disposing)
{
if (!disposing)
return;
_outStream.Close();
}
public void Flush()
{
_outStream.Flush();
}
public long Seek(int offset, SeekOrigin origin)
{
return _outStream.Seek(offset, origin);
}
public void Write(object obj)
{
var ltype = obj.GetType();
switch (ltype.Name.Trim('[', ']'))
{
case "Byte":
if (!ltype.IsArray)
Write((byte) obj);
else
Write((byte[]) obj);
break;
case "Boolean":
if (!ltype.IsArray)
Write((bool) obj);
else
Write((bool[]) obj);
break;
case "SByte":
if (!ltype.IsArray)
Write((sbyte) obj);
else
Write((sbyte[]) obj);
break;
case "Char":
if (!ltype.IsArray)
Write((char) obj);
else
Write((char[]) obj);
break;
case "Int16":
if (!ltype.IsArray)
Write((short) obj);
else
Write((short[]) obj);
break;
case "UInt16":
if (!ltype.IsArray)
Write((ushort) obj);
else
Write((ushort[]) obj);
break;
case "Int32":
if (!ltype.IsArray)
Write((int) obj);
else
Write((int[]) obj);
break;
case "UInt32":
if (!ltype.IsArray)
Write((uint) obj);
else
Write((uint[]) obj);
break;
case "Int64":
if (!ltype.IsArray)
Write((long) obj);
else
Write((long[]) obj);
break;
case "UInt64":
if (!ltype.IsArray)
Write((ulong) obj);
else
Write((ulong[]) obj);
break;
case "Single":
if (!ltype.IsArray)
Write((float) obj);
else
Write((float[]) obj);
break;
case "Double":
if (!ltype.IsArray)
Write((double) obj);
else
Write((double[]) obj);
break;
case "String":
if (!ltype.IsArray)
Write((string) obj);
else
Write((string[]) obj);
break;
case "Decimal":
if (!ltype.IsArray)
Write((decimal) obj);
else
Write((decimal[]) obj);
break;
case "DateTime":
if (!ltype.IsArray)
Write((DateTime) obj);
else
Write((DateTime[]) obj);
break;
}
}
private void Write(bool value)
{
_buffer[0] = value ? (byte) 1 : (byte) 0;
_outStream.Write(_buffer, 0, 1);
}
private void Write(bool[] value)
{
for (var i = 0; i < value.Length; ++i)
{
_buffer[0] = value[i] ? (byte) 1 : (byte) 0;
_outStream.Write(_buffer, 0, 1);
}
}
private void Write(byte value)
{
_outStream.WriteByte(value);
}
private void Write(sbyte value)
{
_outStream.WriteByte((byte) value);
}
private void Write(sbyte[] value)
{
for (var i = 0; i < value.Length; ++i)
_outStream.WriteByte((byte) value[i]);
}
private void Write(byte[] buffer)
{
if (buffer == null)
throw new ArgumentNullException(nameof(buffer));
_outStream.Write(buffer, 0, buffer.Length);
}
private void Write(byte[] buffer, int index, int count)
{
_outStream.Write(buffer, index, count);
}
[SecuritySafeCritical]
private unsafe void Write(char ch)
{
int blen;
fixed (byte* bytes = _buffer)
{
blen = _encoder.GetBytes(&ch, 1, bytes, _buffer.Length, true);
}
_outStream.Write(_buffer, 0, blen);
}
private void Write(char[] chars)
{
if (chars == null)
throw new ArgumentNullException(nameof(chars));
var bytes = _encoding.GetBytes(chars, 0, chars.Length);
_outStream.Write(bytes, 0, bytes.Length);
}
private void Write(char[] chars, int index, int count)
{
var bytes = _encoding.GetBytes(chars, index, count);
_outStream.Write(bytes, 0, bytes.Length);
}
[SecuritySafeCritical]
private unsafe void Write(double value)
{
var num = (ulong) *(long*) &value;
_buffer[0] = (byte) num;
_buffer[1] = (byte) (num >> 8);
_buffer[2] = (byte) (num >> 16);
_buffer[3] = (byte) (num >> 24);
_buffer[4] = (byte) (num >> 32);
_buffer[5] = (byte) (num >> 40);
_buffer[6] = (byte) (num >> 48);
_buffer[7] = (byte) (num >> 56);
_outStream.Write(_buffer, 0, 8);
}
private void Write(double[] value)
{
for (var i = 0; i < value.Length; ++i)
Write(value[i]);
}
private void Write(decimal value)
{
var bits = decimal.GetBits(value);
var lo = bits[0];
var mid = bits[1];
var hi = bits[2];
var flags = bits[3];
_buffer[0] = (byte) lo;
_buffer[1] = (byte) (lo >> 8);
_buffer[2] = (byte) (lo >> 16);
_buffer[3] = (byte) (lo >> 24);
_buffer[4] = (byte) mid;
_buffer[5] = (byte) (mid >> 8);
_buffer[6] = (byte) (mid >> 16);
_buffer[7] = (byte) (mid >> 24);
_buffer[8] = (byte) hi;
_buffer[9] = (byte) (hi >> 8);
_buffer[10] = (byte) (hi >> 16);
_buffer[11] = (byte) (hi >> 24);
_buffer[12] = (byte) flags;
_buffer[13] = (byte) (flags >> 8);
_buffer[14] = (byte) (flags >> 16);
_buffer[15] = (byte) (flags >> 24);
_outStream.Write(_buffer, 0, 16);
}
private void Write(decimal[] value)
{
for (var i = 0; i < value.Length; ++i)
Write(value[i]);
}
private void Write(short value)
{
_buffer[0] = (byte) value;
_buffer[1] = (byte) ((uint) value >> 8);
_outStream.Write(_buffer, 0, 2);
}
private void Write(short[] value)
{
for (var i = 0; i < value.Length; ++i)
Write(value[i]);
}
private void Write(ushort value)
{
_buffer[0] = (byte) value;
_buffer[1] = (byte) ((uint) value >> 8);
_outStream.Write(_buffer, 0, 2);
}
private void Write(ushort[] value)
{
for (var i = 0; i < value.Length; ++i)
Write(value[i]);
}
private void Write(int value)
{
_buffer[0] = (byte) value;
_buffer[1] = (byte) (value >> 8);
_buffer[2] = (byte) (value >> 16);
_buffer[3] = (byte) (value >> 24);
_outStream.Write(_buffer, 0, 4);
}
private void Write(int[] value)
{
for (var i = 0; i < value.Length; ++i)
Write(value[i]);
}
private void Write(uint value)
{
_buffer[0] = (byte) value;
_buffer[1] = (byte) (value >> 8);
_buffer[2] = (byte) (value >> 16);
_buffer[3] = (byte) (value >> 24);
_outStream.Write(_buffer, 0, 4);
}
private void Write(uint[] value)
{
for (var i = 0; i < value.Length; ++i)
Write(value[i]);
}
private void Write(long value)
{
_buffer[0] = (byte) value;
_buffer[1] = (byte) (value >> 8);
_buffer[2] = (byte) (value >> 16);
_buffer[3] = (byte) (value >> 24);
_buffer[4] = (byte) (value >> 32);
_buffer[5] = (byte) (value >> 40);
_buffer[6] = (byte) (value >> 48);
_buffer[7] = (byte) (value >> 56);
_outStream.Write(_buffer, 0, 8);
}
private void Write(long[] value)
{
for (var i = 0; i < value.Length; ++i)
Write(value[i]);
}
private void Write(ulong value)
{
_buffer[0] = (byte) value;
_buffer[1] = (byte) (value >> 8);
_buffer[2] = (byte) (value >> 16);
_buffer[3] = (byte) (value >> 24);
_buffer[4] = (byte) (value >> 32);
_buffer[5] = (byte) (value >> 40);
_buffer[6] = (byte) (value >> 48);
_buffer[7] = (byte) (value >> 56);
_outStream.Write(_buffer, 0, 8);
}
private void Write(ulong[] value)
{
for (var i = 0; i < value.Length; ++i)
Write(value[i]);
}
[SecuritySafeCritical]
private unsafe void Write(float value)
{
var num = *(uint*) &value;
_buffer[0] = (byte) num;
_buffer[1] = (byte) (num >> 8);
_buffer[2] = (byte) (num >> 16);
_buffer[3] = (byte) (num >> 24);
_outStream.Write(_buffer, 0, 4);
}
private void Write(float[] value)
{
for (var i = 0; i < value.Length; ++i)
Write(value[i]);
}
[SecuritySafeCritical]
private void Write(string value)
{
int count;
if (value != null)
count = _encoding.GetByteCount(value);
else
throw new Exception("Value cannot be null");
var LBuffer = new byte[count];
_encoding.GetBytes(value, 0, value.Length, LBuffer, 0);
_outStream.Write(LBuffer, 0, count);
}
private void Write(string[] value)
{
for (var i = 0; i < value.Length; ++i)
Write(value[i]);
}
private unsafe void Write(DateTime value)
{
var numArray = new byte[8];
fixed (byte* ptr = numArray)
{
*(long*) ptr = value.Ticks;
}
_buffer[0] = numArray[0];
_buffer[1] = numArray[1];
_buffer[2] = numArray[2];
_buffer[3] = numArray[3];
_buffer[4] = numArray[4];
_buffer[5] = numArray[5];
_buffer[6] = numArray[6];
_buffer[7] = numArray[7];
_outStream.Write(_buffer, 0, 8);
}
private void Write(DateTime[] value)
{
for (var i = 0; i < value.Length; ++i)
Write(value[i]);
}
}