namespace Invercargill { public enum Endianness { Native, BigEndian, LittleEndian, } [GenericAccessors] public interface ReadOnlyAddressableBytes : ReadOnlyAddressable, Equatable>, BinaryData, Hashable { public virtual int64? get_int64(int index, Endianness endianness = Endianness.Native) throws IndexError { var data = get_slice(index, sizeof(int64)); int64 value = 0; int64 val = 0; Memory.copy(&value, data, sizeof(int64)); switch (endianness) { case Endianness.Native: val = value; break; case Endianness.BigEndian: val = value.to_big_endian(); break; case Endianness.LittleEndian: val = value.to_little_endian(); break; } return val; } public virtual uint64? get_uint64(int index, Endianness endianness = Endianness.Native) throws IndexError { var data = get_slice(index, sizeof(uint64)); uint64 value = 0; uint64 val = 0; Memory.copy(&value, data, sizeof(uint64)); switch (endianness) { case Endianness.Native: val = value; break; case Endianness.BigEndian: val = value.to_big_endian(); break; case Endianness.LittleEndian: val = value.to_little_endian(); break; } return val; } public virtual int32? get_int32(int index, Endianness endianness = Endianness.Native) throws IndexError { var data = get_slice(index, sizeof(int32)); int32 value = 0; int32 val = 0; Memory.copy(&value, data, sizeof(int32)); switch (endianness) { case Endianness.Native: val = value; break; case Endianness.BigEndian: val = value.to_big_endian(); break; case Endianness.LittleEndian: val = value.to_little_endian(); break; } return val; } public virtual uint32? get_uint32(int index, Endianness endianness = Endianness.Native) throws IndexError { var data = get_slice(index, sizeof(uint32)); uint32 value = 0; uint32 val = 0; Memory.copy(&value, data, sizeof(uint32)); switch (endianness) { case Endianness.Native: val = value; break; case Endianness.BigEndian: val = value.to_big_endian(); break; case Endianness.LittleEndian: val = value.to_little_endian(); break; } return val; } public virtual int16? get_int16(int index, Endianness endianness = Endianness.Native) throws IndexError { var data = get_slice(index, sizeof(int16)); int16 value = 0; int16 val = 0; Memory.copy(&value, data, sizeof(int16)); switch (endianness) { case Endianness.Native: val = value; break; case Endianness.BigEndian: val = value.to_big_endian(); break; case Endianness.LittleEndian: val = value.to_little_endian(); break; } return val; } public virtual uint16? get_uint16(int index, Endianness endianness = Endianness.Native) throws IndexError { var data = get_slice(index, sizeof(uint16)); uint16 value = 0; uint16 val = 0; Memory.copy(&value, data, sizeof(uint16)); switch (endianness) { case Endianness.Native: val = value; break; case Endianness.BigEndian: val = value.to_big_endian(); break; case Endianness.LittleEndian: val = value.to_little_endian(); break; } return val; } public virtual int8? get_int8(int index) throws IndexError { var data = get_slice(index, sizeof(int8)); int8 value = 0; Memory.copy(&value, data, sizeof(int8)); return value; } public virtual uint8? get_uint8(int index) throws IndexError { var data = get_slice(index, sizeof(uint8)); uint8 value = 0; Memory.copy(&value, data, sizeof(uint8)); return value; } private uint8[] get_slice(uint index, ulong size) throws IndexError { var slice = new uint8[size]; for(int i = 0; i < size; i++) { slice[i] = this[i + index]; } return slice; } } }