using System; using System.Text; using System.Collections.Generic; namespace bintalk { /** This class can read basic types by using a bintalk.IReader object. */ public static partial class ProtocolReader { public static bool readMid(bintalk.IReader r, ref ushort v) { return read(r, ref v, 0); } // int64 public static bool read(bintalk.IReader r, ref long v, uint maxValue) { byte[] data; int startId; if (!r.read(8, out data, out startId)) return false; v = BitConverter.ToInt64(data, startId); return true; } // uint64 public static bool read(bintalk.IReader r, ref ulong v, uint maxValue) { byte[] data; int startId; if (!r.read(8, out data, out startId)) return false; v = BitConverter.ToUInt64(data, startId); return true; } // double public static bool read(bintalk.IReader r, ref double v, uint maxValue) { byte[] data; int startId; if (!r.read(8, out data, out startId)) return false; v = BitConverter.ToDouble(data, startId); return true; } // float public static bool read(bintalk.IReader r, ref float v, uint maxValue) { byte[] data; int startId; if (!r.read(4, out data, out startId)) return false; v = BitConverter.ToSingle(data, startId); return true; } // int32 public static bool read(bintalk.IReader r, ref int v, uint maxValue) { byte[] data; int startId; if (!r.read(4, out data, out startId)) return false; v = BitConverter.ToInt32(data, startId); return true; } // uint32 public static bool read(bintalk.IReader r, ref uint v, uint maxValue) { byte[] data; int startId; if (!r.read(4, out data, out startId)) return false; v = BitConverter.ToUInt32(data, startId); return true; } // int16 public static bool read(bintalk.IReader r, ref short v, uint maxValue) { byte[] data; int startId; if (!r.read(2, out data, out startId)) return false; v = BitConverter.ToInt16(data, startId); return true; } // uint16 public static bool read(bintalk.IReader r, ref ushort v, uint maxValue) { byte[] data; int startId; if (!r.read(2, out data, out startId)) return false; v = BitConverter.ToUInt16(data, startId); return true; } // int8 public static bool read(bintalk.IReader r, ref sbyte v, uint maxValue) { byte[] data; int startId; if (!r.read(1, out data, out startId)) return false; v = (sbyte)data[startId]; return true; } // uint8 public static bool read(bintalk.IReader r, ref byte v, uint maxValue) { byte[] data; int startId; if (!r.read(1, out data, out startId)) return false; v = data[startId]; return true; } // bool public static bool read(bintalk.IReader r, ref bool v, uint maxValue) { byte[] data; int startId; if (!r.read(1, out data, out startId)) return false; v = (data[startId] == 0)?false:true; return true; } // string. public static bool read(bintalk.IReader r, ref string v, uint maxValue) { uint s; if (!readDynSize(r, out s) || s > maxValue) return false; byte[] data; int startId; if(!r.read(s, out data, out startId)) return false; v = Encoding.UTF8.GetString(data, startId, (int)s); return true; } // binary. public static bool read(bintalk.IReader r, ref byte[] v, uint maxValue) { uint s; if (!readDynSize(r, out s) || s > maxValue) return false; v = new byte[s]; byte[] data; int startId; if(!r.read(s, out data, out startId)) return false; Array.Copy(data, startId, v, 0, s); return true; } // dynamic size. public static bool readDynSize(bintalk.IReader r, out uint s) { s = 0; byte b = 0; if (!read(r, ref b, 0)) return false; uint n = (uint)((b & 0XC0) >> 6); s = (uint)(b & 0X3F); for (int i = 0; i < n; i++) { if (!read(r, ref b, 0)) return false; s = (s << 8) | b; } return true; } } }