从文件中提取字节数组

时间:2011-01-25 22:21:40

标签: c# arrays

我正在尝试读取一个文件并提取2个数据块,让我们从文件包含许多数据块的文件中调用它们block1和block2。两个块都需要 以字节数组返回。 Block1将从行开始的文件中的位置开始 “block1:”后跟要读取的字节数。 Block2,不一定出现在 block1,将从文件中的行开始“block2:”后面跟着 要读取的字节数。我最高限制在.Net 3.5。

3 个答案:

答案 0 :(得分:0)

如果你知道它们所在的索引,你可以使用File.ReadAllBytes并使用其中一个Array.Copy重载从返回的byte[]中提取块。

答案 1 :(得分:0)

如果文件中没有任何类型的标题信息,则必须扫描整个文件,搜索block1:block2:个标记。

<强>更新

以下是您如何执行此操作的示例(不一定是最佳实现):

byte[] GetBlockOfData(string fileName, string blockName)
{
    var allBytes = File.ReadAllBytes(fileName);
    // Assuming block names are ASCII-encoded
    var blockMarker = Encoding.ASCII.GetBytes(blockName + ":"); 

    // Scan for the first byte of the marker
    for (var i = 0; i < allBytes.Length; i++)
    {
        if (allBytes[i] == blockMarker[i])
        {
            // See if this is the entire marker
            var isMatch == true;
            for (var j = 0; j < blockMarker.Length; j++)
            {
                if (allBytes[i + j] != blockMarker[j])
                {
                    isMatch = false;
                    break;
                }
            }
            if (isMatch)
            {
                // Assuming it's a byte...
                var blockLength = allBytes[i + blockMarker.Length];
                var result = new byte[blockLength];
                Array.Copy(
                    allBytes, i + blockMarker.Length + 1, result, 0,
                    blockLength);
                return result;
            }
        }
    }
    return null;
}

答案 2 :(得分:0)

正如其他人所提到的,如果没有标题信息,您至少需要通过某种类型的过滤器来流式传输文件内容,以查找“块”标记。

如果您确实有标题信息(或至少某些关于块标记偏移的信息),您可以使用内存映射文件:

http://www.developer.com/net/article.php/3828586/Using-Memory-Mapped-Files-in-NET-40.htm

这需要.NET 4.0,但如果您不使用.NET 4,也可以使用Win32 API。