public async Task WritePointerAsync(long index, long pointer) { EnsureLengthIsLargeEnough((int)index + 8); await Data.WriteInt64Async(index, pointer).ConfigureAwait(false); PointerOffsets.Add(index); }
private void WriteFooter(int footerOffset) { long lastPointer = 0; PointerOffsets.Sort(); foreach (var pointer in PointerOffsets) { var pointerRelativeIndex = pointer - lastPointer; lastPointer = pointer; if (pointerRelativeIndex < 128) { this.Write(footerOffset++, (byte)pointerRelativeIndex); } else { var workingBytes = new List <byte>(); var workingItem = pointerRelativeIndex; workingBytes.Add((byte)(workingItem & 0x7F)); workingItem >>= 7; while (workingItem > 0) { workingBytes.Add((byte)((workingItem & 0x7F) | 0x80)); workingItem >>= 7; } for (var i = workingBytes.Count - 1; i >= 0; i--) { this.Write(footerOffset++, workingBytes[i]); } } } this.Write(footerOffset++, 0); // Marks the end of the pointers // Align to 16 bytes var paddingLength = 0x10 - (this.Length % 0x10); if (paddingLength != 0x10) { this.WritePadding(footerOffset, paddingLength); } }
public void WritePointer(long index, long pointer) { EnsureLengthIsLargeEnough((int)index + 8); Data.WriteInt64(index, pointer); PointerOffsets.Add(index); }
/// <summary> /// Registers the data at the given index as a pointer /// </summary> /// <param name="index">Index of the pointer</param> public void MarkPointer(long index) { PointerOffsets.Add(index); }