public virtual object ReadValue(System.Reflection.FieldInfo f, ImageReader rdr, ReaderContext ctx) { Func<ImageReader, object> fn; if (readers.TryGetValue(f.FieldType, out fn)) { return fn(rdr); } throw new NotSupportedException(string.Format("Field type {0} not supported.", f.FieldType.FullName)); }
public override object ReadValue(FieldInfo f, ImageReader rdr, ReaderContext ctx) { int i = 0; for (; rdr.PeekByte(i) != 0; ++i) { } var s = Encoding.UTF8.GetString(rdr.ReadBytes(i)); rdr.Offset++; return s; }
public static object ReadPointer(Type pointerType, int size, ImageReader rdr, ReaderContext ctx) { Debug.Print("Reading pointer at offset {0}, size {1}", rdr.Offset, size); uint newOffset; switch (size) { default: throw new InvalidOperationException("Field size must be > 0."); case 1: newOffset = rdr.ReadByte(); break; case 2: newOffset = rdr.ReadUInt16(); break; case 4: newOffset = rdr.ReadUInt32(); break; } Debug.Print("Structure of type {0} must start at offset {1:X}", pointerType.Name, newOffset); rdr = rdr.Clone(); rdr.Offset = newOffset; var dst = Activator.CreateInstance(pointerType); var sr = new StructureReader(dst); sr.Read(rdr); return dst; }
public static object ReadPointer(Type pointerType, int size, ImageReader rdr, ReaderContext ctx) { Debug.Print("Reading pointer at offset {0}, size {1}", rdr.Offset, size); uint newOffset; switch (size) { default: throw new InvalidOperationException("Field size must be > 0."); case 1: newOffset = rdr.ReadByte(); break; case 2: newOffset = rdr.ReadUInt16(); break; case 4: newOffset = rdr.ReadUInt32(); break; } Debug.Print("Structure of type {0} must start at offset {1:X}", pointerType.Name, newOffset); rdr = rdr.Clone(); rdr.Offset = newOffset; var dst = Activator.CreateInstance(pointerType); var sr = new StructureReader(dst); sr.Read(rdr); return(dst); }
public override object ReadValue(FieldInfo f, EndianImageReader rdr, ReaderContext ctx) { return(ReadPointer(f.FieldType, Size, rdr, ctx)); }
public virtual object ReadValue(System.Reflection.FieldInfo f, EndianImageReader rdr, ReaderContext ctx) { Func <EndianImageReader, object> fn; if (readers.TryGetValue(f.FieldType, out fn)) { return(fn(rdr)); } throw new NotSupportedException(string.Format("Field type {0} not supported.", f.FieldType.FullName)); }
public override object ReadValue(FieldInfo f, ImageReader rdr, ReaderContext ctx) { return ReadPointer(f.FieldType, Size, rdr, ctx); }
public override object ReadValue(FieldInfo f, ImageReader rdr, ReaderContext ctx) { var elemType = f.FieldType.GetElementType(); if (Length > 0) { Debug.Print("Array: at offset {0}, reading {1} entries", rdr.Offset, Length); var a = (Array) Activator.CreateInstance(f.FieldType, Length); if (PointerElementSize > 0) { for (int i = 0; i < Length; ++i) { var value= PointerFieldAttribute.ReadPointer(elemType, PointerElementSize, rdr, ctx); a.SetValue(value, i); } return a; } throw new NotImplementedException(); } throw new NotImplementedException(); }