52 lines
1.2 KiB
C#
52 lines
1.2 KiB
C#
//
|
|
// Author:
|
|
// Jb Evain (jbevain@gmail.com)
|
|
//
|
|
// Copyright (c) 2008 - 2015 Jb Evain
|
|
// Copyright (c) 2008 - 2011 Novell, Inc.
|
|
//
|
|
// Licensed under the MIT/X11 license.
|
|
//
|
|
|
|
using System;
|
|
|
|
namespace MonoFN.Cecil.Metadata
|
|
{
|
|
internal sealed class BlobHeap : Heap
|
|
{
|
|
public BlobHeap(byte[] data) : base(data) { }
|
|
|
|
public byte[] Read(uint index)
|
|
{
|
|
if (index == 0 || index > data.Length - 1)
|
|
return Empty<byte>.Array;
|
|
|
|
int position = (int)index;
|
|
int length = (int)data.ReadCompressedUInt32(ref position);
|
|
|
|
if (length > data.Length - position)
|
|
return Empty<byte>.Array;
|
|
|
|
byte[] buffer = new byte [length];
|
|
|
|
Buffer.BlockCopy(data, position, buffer, 0, length);
|
|
|
|
return buffer;
|
|
}
|
|
|
|
public void GetView(uint signature, out byte[] buffer, out int index, out int length)
|
|
{
|
|
if (signature == 0 || signature > data.Length - 1)
|
|
{
|
|
buffer = null;
|
|
index = length = 0;
|
|
return;
|
|
}
|
|
|
|
buffer = data;
|
|
|
|
index = (int)signature;
|
|
length = (int)buffer.ReadCompressedUInt32(ref index);
|
|
}
|
|
}
|
|
} |