Пример #1
0
        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);
            }
        }
Пример #3
0
 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);
 }