public bool WriteStructMember(ORNames Struct, ORNames Member, Object NewValue, uint Address = 0) { if (Address <= 0) { Address = GetStructAddress(Struct); } int Offset = GetStructMemberOffset(Struct, Member); int Size = GetStructMemberSize(Struct, Member); int Count = GetStructMemberCount(Struct, Member); Type type = GetStructMemberType(Struct, Member); if (Count <= 0 && NewValue.GetType() != type) { throw new InvalidCastException("OffsetReader.WriteStructMember: NewValue is not of the expected type. NewValue type: " + NewValue.GetType().ToString() + " Expected type: " + type.ToString()); } if (type == StringType) { int Length = Size; byte[] StringAsBytes = Encoding.UTF8.GetBytes((string)NewValue); byte[] buffer = new byte[Length]; Array.Copy(StringAsBytes, buffer, StringAsBytes.Length < buffer.Length - 1 ? StringAsBytes.Length : buffer.Length - 1); buffer[buffer.Length - 1] = 0; return(mem.WriteMemory((uint)(Offset + Address), buffer.Length, ref buffer)); } if (Count <= 0) { byte[] buffer = ReadWriteMemory.RawSerialize(NewValue); return(mem.WriteMemory((uint)(Offset + Address), buffer.Length, ref buffer)); } else { Array NewArray = (Array)NewValue; byte[] buffer = new byte[Size]; for (int i = 0; i < Count && i < NewArray.Length; i++) { ReadWriteMemory.RawSerialize(NewArray.GetValue(i)).CopyTo(buffer, i * Size / Count); } return(mem.WriteMemory((uint)(Offset + Address), buffer.Length, ref buffer)); } }
public void WriteStructMember(ORNames Struct, ORNames Member, Object NewValue, ref byte[] Data) { int Offset = GetStructMemberOffset(Struct, Member); int Size = GetStructMemberSize(Struct, Member); int Count = GetStructMemberCount(Struct, Member); Type type = GetStructMemberType(Struct, Member); if (Count <= 0 && NewValue.GetType() != type) { throw new InvalidCastException("OffsetReader.WriteStructMember: NewValue is not of the expected type. NewValue type: " + NewValue.GetType().ToString() + " Expected type: " + type.ToString()); } if (type == StringType) { int Length = Size; byte[] StringAsBytes = Encoding.UTF8.GetBytes((string)NewValue); int CopyLength = StringAsBytes.Length < Length - 1 ? StringAsBytes.Length : Length - 1; Array.Copy(StringAsBytes, 0, Data, Offset, CopyLength); Data[Offset + CopyLength] = 0; return; } if (Count <= 0) { byte[] buffer = ReadWriteMemory.RawSerialize(NewValue); buffer.CopyTo(Data, Offset); return; } else { Array NewArray = (Array)NewValue; byte[] buffer = new byte[Size]; for (int i = 0; i < Count && i < NewArray.Length; i++) { ReadWriteMemory.RawSerialize(NewArray.GetValue(i)).CopyTo(buffer, i * Size / Count); } buffer.CopyTo(Data, Offset); return; } }