0

にファイルがあり、オフセットごとにバイトbyte[]を削除する必要があります(オフセットのリストがあります)。私はそれを行うためのいくつかのコードを持っていますが、それを行うためのより良い方法があるかどうか疑問に思っています。0x1000x

private byte[] RemoveHashBlocks(byte[] fileArray, STFSExplorer stfs)
{
    long startOffset = StartingOffset;
    long endOffset = StartingOffset + Size;

    List<long> hashBlockOffsets = new List<long>();
    foreach (xBlockEntry block in stfs._stfsBlockEntry) 
        if (block.IsHashBlock && (block.BlockOffset >= startOffset && block.BlockOffset <= endOffset))
            hashBlockOffsets.Add(block.BlockOffset - (hashBlockOffsets.Count * 0x1000));

    byte[] newFileAray = new byte[fileArray.Length - (hashBlockOffsets.Count * 0x1000)];

    for (int offset = 0; offset < fileArray.Length; offset++)
        if (hashBlockOffsets[0] == offset)
        {
            offset += 0x1000;
            hashBlockOffsets.RemoveAt(0);
        }
        else
            newFileAray[offset] = fileArray[offset];

    return newFileAray;
}
4

1 に答える 1

0
private byte[] RemoveHashBlocks(byte[] fileArray, STFSExplorer stfs)
{
    long startOffset = StartingOffset;
    long size = Size;

    MemoryStream ms = new MemoryStream();
    long lastBlockEnd = 0;

    foreach (xBlockEntry block in stfs._stfsBlockEntry)
    {
        if (block.IsHashBlock)
        {
            long offset = block.BlockOffset - startOffset;
            if (offset + 0x1000 > 0 && offset < size)
            {
                if (offset > lastBlockEnd)
                {
                    ms.Write(fileArray, (int) lastBlockEnd,
                            (int) (offset - lastBlockEnd));
                }
                lastBlockEnd = offset + 0x1000;
            }
        }
    }

    if (lastBlockEnd < size)
    {
        ms.Write(fileArray, (int) lastBlockEnd, (int) (size - lastBlockEnd));
    }

    return ms.ToArray();
}

stfs._stfsBlockEntryこれは、 が でソートされていることを前提としていBlockOffsetます。

于 2012-07-15T22:46:07.897 に答える