public void SetBaseOffset(int baseOffset) { foreach (Pointer p in _lPointers) { // Our example label is SEQ_STUFF at the binary offset 0x1000, curBaseOffset is 0x500, baseOffset is 0x1800 // There is a pointer (p) to SEQ_STUFF at the binary offset 0x1DFC int oldPointer = EndianBitConverter.BytesToInt32(Binary, p.BinaryOffset, Endianness); // If there was a pointer to "SEQ_STUFF+4", the pointer would be 0x1504, at binary offset 0x1DFC int labelOffset = oldPointer - BaseOffset; // Then labelOffset is 0x1004 (SEQ_STUFF+4) byte[] newPointerBytes = EndianBitConverter.Int32ToBytes(baseOffset + labelOffset, Endianness); // b will contain {0x04, 0x28, 0x00, 0x00} [0x2804] (SEQ_STUFF+4 + baseOffset) for (int i = 0; i < 4; i++) { _bytes[p.BinaryOffset + i] = newPointerBytes[i]; // Copy the new pointer to binary offset 0x1DF4 } } BaseOffset = baseOffset; }
public DLSID(byte[] data) { if (data is null) { throw new ArgumentNullException(nameof(data)); } if (data.Length != 16) { throw new ArgumentOutOfRangeException(nameof(data.Length)); } Data1 = (uint)EndianBitConverter.BytesToInt32(data, 0, Endianness.LittleEndian); Data2 = (ushort)EndianBitConverter.BytesToInt16(data, 4, Endianness.LittleEndian); Data3 = (ushort)EndianBitConverter.BytesToInt16(data, 6, Endianness.LittleEndian); Data4 = new byte[8]; for (int i = 0; i < 8; i++) { Data4[i] = data[8 + i]; } }