public bool DecodePacket <T>(uint id, out T packet, byte[] buffer) { var binary = new OseanBinary(buffer); try { packet = Activator.CreateInstance <T>(); var fields = this._packets[id].Fields; for (var i = 0; i < fields.Count; ++i) { var field = fields[i]; var fieldType = fields[i].DataType; var nextFieldType = i + 1 < fields.Count ? fields[i + 1].DataType : OseanDataType.None; field.Field.SetValue(packet, this.ReadValue(binary, fieldType, nextFieldType)); if (fieldType == OseanDataType.Array) { ++i; } } } catch { packet = default(T); return(false); } return(true); }
private object ReadValue(OseanBinary binary, OseanDataType type, OseanDataType arrayType) { return(type switch { OseanDataType.I8 => binary.ReadI8(), OseanDataType.I16 => binary.ReadI16(), OseanDataType.I32 => binary.ReadI32(), OseanDataType.I64 => binary.ReadI64(), OseanDataType.U8 => binary.ReadU8(), OseanDataType.U16 => binary.ReadU16(), OseanDataType.U32 => binary.ReadU32(), OseanDataType.U64 => binary.ReadU64(), OseanDataType.R32 => binary.ReadR32(), OseanDataType.R64 => binary.ReadR64(), OseanDataType.Boolean => binary.ReadU8() != 0, OseanDataType.String => binary.ReadString(), OseanDataType.WString => binary.ReadWString(), OseanDataType.Array => ((Func <Array>)(() => { var array = Array.CreateInstance(this.TypeFromDataType(arrayType), binary.ReadI32()); for (var i = 0; i < array.Length; ++i) { array.SetValue(this.ReadValue(binary, arrayType, OseanDataType.None), i); } return array; }))(), _ => throw new InvalidOperationException("cannot read invalid type code!") });
public bool EncodePacket <T>(uint id, T packet, out byte[] buffer) { buffer = null; if (!this._packets.ContainsKey(id)) { return(false); } var binary = new OseanBinary(); try { var fields = this._packets[id].Fields; for (var i = 0; i < fields.Count; ++i) { var field = fields[i]; var fieldType = fields[i].DataType; var nextFieldType = i + 1 < fields.Count ? fields[i + 1].DataType : OseanDataType.None; this.WriteValue(binary, fieldType, nextFieldType, field.Field.GetValue(packet)); if (fieldType == OseanDataType.Array) { ++i; } } } catch { return(false); } buffer = binary.Buffer(); return(true); }