using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EPD.Data { class ByteReader { private byte[] buffer; private int idx; private int length; public int Length => length; public ByteReader(byte[] data, int len) { buffer = new byte[len]; Buffer.BlockCopy(data, 0, buffer, 0, len); length = len; idx = 0; } public void Append(byte[] data, int len) { var buf = new byte[Length + len]; Buffer.BlockCopy(buffer, 0, buf, 0, Length); Buffer.BlockCopy(data, 0, buf, Length, len); buffer = buf; length += len; } public bool Reset(int curIdx = 0) { if (curIdx < length) idx = curIdx; return idx == curIdx; } public bool ReadByte(out byte data) { data = buffer[idx]; idx++; return true; } public bool ReadBytes(byte[] buf, int len) { if (idx + len <= length) { Buffer.BlockCopy(buffer, (int)idx, buf, 0, (int)len); idx += len; return true; } return false; } public bool ReadInt(out int data) { data = 0; if (idx + 4 <= length) { data = BitConverter.ToInt32(buffer, (int)idx); idx += 4; return true; } return false; } public bool ReadUInt16(out UInt16 data) { data = 0; if (idx + 2 <= length) { data = BitConverter.ToUInt16(buffer, (int)idx); idx += 2; return true; } return false; } public bool ReadInt64(out Int64 data) { data = 0; if (idx + 8 <= length) { data = BitConverter.ToInt64(buffer, (int)idx); idx += 8; return true; } return false; } public bool ReadString(out string str, int len) { str = System.Text.Encoding.Default.GetString(buffer, idx, len); str = str.Substring(0, str.IndexOf('\0')); idx += len; return true; } } }