Cbytesreader class
Using System; namespace Common {///<summary>///author:Jave.Lin///date:2018-03-24///</summar
Y> public class Cbytesreader:idisposable {public static bool Islittleendian//return True {
get {return Bitconverter.islittleendian;}
} private int _m_ipos;
Private byte[] _m_pbuffer;
private int _m_iidx;
private int _m_ilen;
public int Irealpos {get {return _m_iidx + _m_ipos;}}
public int Iidx {get {return _m_iidx;}} public int IPos {get {return _m_ipos;}
set {_m_ipos = value;}}
public int Ilen {get {return _m_ilen;}}
public int Iremainfreesize {get {return _m_ilen-_m_ipos;}} Public Cbytesreader () {} public Cbytesreader (byte[] buffer, int idx = 0, int len = 0) {SETB
Uffer (buffer, IDX, Len); public void Dispose () {_m_pbuffer = Null
} public void SetBuffer (byte[] buffer, int idx = 0, int len = 0) {if (buffer = null)
{_m_pbuffer = null;
_m_iidx = 0;
_m_ilen = 0;
else {_m_pbuffer = buffer;
_m_iidx = idx; _m_ilen = Len = 0?
_m_pbuffer.length:len;
_checklen (_m_ilen);
} public void Addlen (int value) {var PreV = _m_ilen + value;
_checklen (PreV);
public void Setlen (int len) {_m_ilen = Len;
}///<summary>///Attention, it'll change Original-buffer data!
</summary> public void trimreaded () {var remain = iremainfreesize;
var rpos = Irealpos;
if (Remain > 0 && rpos!= _m_iidx) { Buffer.blockcopy (_m_pbuffer, RpoS, _m_pbuffer, _m_iidx, remain);
} _m_ipos = 0; } public void TrimReaded1 (int canRead) {if (CanRead > 0) {var
RealPos = Irealpos; var canreadpos = RealPos + canRead;
Real POS + can read Len Buffer.blockcopy (_m_pbuffer, RealPos, _m_pbuffer, _m_iidx, CanRead);
Array.clear (_m_pbuffer, CanRead + _m_iidx, canreadpos);
} _m_ipos = 0;
Public Char Readchar () {_checkremain (2);
var ret = Bitconverter.tochar (_m_pbuffer, _m_iidx + _m_ipos);
_m_ipos + 2;
return ret;
public bool Readbool () {_checkremain (1);
return _M_PBUFFER[_M_IIDX + _m_ipos++]!= 0;
Public sbyte Readsbyte () {_checkremain (1); Return (sbyte) _m_pbuffer[_m_iidx + _m_ipos++];
Public byte ReadByte () {_checkremain (1);
return _m_pbuffer[_m_iidx + _m_ipos++]; public void Readbytes (byte[] result, int resultlen, int resultidx = 0) {if (result = null ) {_throwerr (this. GetType ().
FullName + "Readbytes Argument:result = null"); } if (result. LENGTH-RESULTIDX) < Resultlen) {_throwerr (this. GetType ().
FullName + "Readbytes Argument:resultlen too Large");
} _checkremain (Resultlen);
Buffer.blockcopy (_m_pbuffer, _m_iidx + _m_ipos, result, Resultidx, Resultlen);
_m_ipos + = Resultlen;
public short ReadInt16 () {_checkremain (2);
var ret = bitconverter.toint16 (_m_pbuffer, _m_iidx + _m_ipos);
_m_ipos + 2;
return ret; } public ushort ReaduInt16 () {_checkremain (2);
var ret = bitconverter.touint16 (_m_pbuffer, _m_iidx + _m_ipos);
_m_ipos + 2;
return ret;
public int ReadInt32 () {_checkremain (4);
var ret = Bitconverter.toint32 (_m_pbuffer, _m_iidx + _m_ipos);
_m_ipos + 4;
return ret;
Public UINT ReadUInt32 () {_checkremain (4);
var ret = Bitconverter.touint32 (_m_pbuffer, _m_iidx + _m_ipos);
_m_ipos + 4;
return ret;
Public long ReadInt64 () {_checkremain (8);
var ret = Bitconverter.toint64 (_m_pbuffer, _m_iidx + _m_ipos);
_m_ipos + 8;
return ret;
Public ulong ReadUInt64 () {_checkremain (8);
var ret = Bitconverter.touint64 (_m_pbuffer, _m_iidx + _m_ipos);
_m_ipos + 8; ReturnRet
public float Readsingle () {_checkremain (4);
var ret = Bitconverter.tosingle (_m_pbuffer, _m_iidx + _m_ipos);
_m_ipos + 4;
return ret;
Public double readdouble () {_checkremain (8);
var ret = bitconverter.todouble (_m_pbuffer, _m_iidx + _m_ipos);
_m_ipos + 8;
return ret;
private void _checkremain (int value) {if (Iremainfreesize < value) { _throwerr (this. GetType ().
FullName + "EOB (end of byte[])");
} private void _checklen (int value) {if (Value > (_m_pbuffer.length-_m_iidx)) {_throwerr (this. GetType (). FullName + "Set Read buffer ' s Len larger than buffer.
Length "); }} private void _throwerr (string errmsg) {throw new Exception (errmsg); }
}
}
Application
The following Bitconverterext class, where you can see the implementation
var one = false;
var two = true;
var three = true;
var four = false;
var arrbool = new Bool[3] {true, false, true};
var bytes = new byte[200];
var pos = 0;
Bitconverterext.getbytes (bytes, one, 0);
Bitconverterext.getbytes (bytes, two, pos + sizeof (BOOL));
Bitconverterext.getbytes (bytes, three, pos + sizeof (BOOL));
Bitconverterext.getbytes (bytes, four, pos + sizeof (BOOL));
Bitconverterext.getbytes (Bytes, ' a ', pos + sizeof (BOOL));
Bitconverterext.getbytes (Bytes, arrbool, pos + sizeof (char));
Bitconverterext.getbytes (bytes, (ushort) 0xf0ff, pos = sizeof (BOOL) * 3);
Bitconverterext.getbytes (bytes, new char[] {' A ', ' B '}, pos + sizeof (ushort));
Bitconverterext.getbytes (bytes, new ushort[] {0xff, 0x8}, pos + = sizeof (char) * 2); Bitconverterext.getbytes (Bytes, 0xff, pos + sizeof (ushort) * 2);
Bitconverterext.getbytes (Bytes, 0xffffffu, pos + sizeof (int));
Bitconverterext.getbytes (Bytes, 0.999f, pos + sizeof (UINT));
Bitconverterext.getbytes (Bytes, 0.999D, pos + sizeof (float));
Bitconverterext.getbytes (bytes, new int[] {1, 2, 3, 4}, pos + + sizeof (double));
Bitconverterext.getbytes (bytes, new uint[] {5, 6, 7, 8}, pos = sizeof (int) * 4);
Bitconverterext.getbytes (bytes, new float[] {0.1f, 0.2f, 0.3f, 0.4f}, pos + + sizeof (UINT) * 4);
Bitconverterext.getbytes (bytes, new double[] {0.1d, 0.2d, 0.3d, 0.4d}, pos = sizeof (FLOAT) * 4);
Bitconverterext.getbytes (bytes, new long[] {0xff, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF}, pos + + sizeof (double) * 4);
Bitconverterext.getbytes (bytes, new ulong[] {0xffff, 0xffffff, 0xFFFFFFFF, 0xffffffffff}, pos = sizeof (LONG) * 4); var reader = new Cbytesreader (bytes);
Output
+ bytes {byte[200]} byte[] reader.iidx 0 int Reader.ilen int reader.ipos 183 int Reader.irealpos 183 int Reader.iremain int reader. ReadByte () 1 byte reader. ReadByte () 0 byte reader. ReadByte () 1 byte reader. ReadUInt16 () 61695 ushort 0xf0ff 61695 int reader. Readchar () ' A ' char reader. Readchar () ' B ' char reader. ReadUInt16 () 255 ushort Reader. ReadUInt16 () 8 ushort Reader. ReadUInt32 () 255 UINT reader. ReadUInt32 () 16777215 uint 0xffffffu 16777215 UINT reader. Readsingle () 0.999 float reader. Readdouble () 0.999 double reader. ReadInt32 () 1 int reader. ReadInt32 () 2 int reader. ReadInt32 () 3 int reader. ReadInt32 () 4 int reader. ReadUInt32 () 5 uint reader. ReadUInt32 () 6 uint reader. ReadUInt32 () 7 UINT reader. REadUInt32 () 8 uint reader. Readsingle () 0.1 float reader. Readsingle () 0.2 float reader. Readsingle () 0.3 float reader. Readsingle () 0.4 float reader. Readdouble () 0.1 double reader. Readdouble () 0.2 double reader. Readdouble () 0.3 double reader. Readdouble () 0.4 double reader. ReadInt64 () 255 long reader. ReadInt64 () 65535 long reader. ReadInt64 () 16777215 long reader. ReadInt64 () 4294967295 long reader. ReadUInt64 () 65535 ulong reader. ReadUInt64 () 16777215 ulong reader. ReadUInt64 () 4294967295 ulong reader.
ReadUInt64 () 1099511627775 ULONG