从文件中读取多个字节数组

时间:2017-06-08 16:22:32

标签: c# arrays

如何从文件中读取多个字节数组?这些字节数组是图像,可能很大。

这就是我将它们添加到文件中的方式:

 using (var stream = new FileStream(tempFile, FileMode.Append))
      {
        //convertedImage = one byte array
        stream.Write(convertedImage, 0, convertedImage.Length);
      }

所以,现在他们在tempFile,我不知道如何将它们作为单独的数组检索。理想情况下,我希望将它们作为IEnumerable<byte[]>。有没有办法拆分它们,也许?

3 个答案:

答案 0 :(得分:2)

除非您可以根据这些字节的内容自行计算出每个数组所占的字节数,否则您需要将图像数量及其各自的长度存储到文件中。

有很多方法可以做到这一点:您可以在每个字节数组之前编写各个数组的长度,或者在将“有效负载”数据写入文件之前,您可以编写描述其余内容的“标题”。 / p>

标题可能如下所示:

Byte offset    Description
-----------  -------------------
0000...0003 - Number of files, N
0004...000C - Length of file 1
000D...0014 - Length of file 2
...
XXXX...XXXX - Length of file N
XXXX...XXXX - Content of file 1
XXXX...XXXX - Content of file 2
...
XXXX...XXXX - Content of file N

您可以使用BitConverter方法生成要写入标题的字节数组,也可以使用BinaryWriter

答案 1 :(得分:2)

要检索多组字节数组,您需要知道读取时的长度。最简单的方法是(如果你可以改变编写代码)是添加一个长度值:

using (var stream = new FileStream(tempFile, FileMode.Append))
{
    //convertedImage = one byte array
    // All ints are 4-bytes
    stream.Write(BitConverter.GetBytes(convertedImage.Length), 0, 4);
    // now, we can write the buffer
    stream.Write(convertedImage, 0, convertedImage.Length);
}

然后

读取数据
using (var stream = new FileStream(tempFile, FileMode.Open))
{
    // loop until we can't read any more
    while (true)
    {
        byte[] convertedImage;
        // All ints are 4-bytes
        int size;
        byte[] sizeBytes = new byte[4];
        // Read size
        int numRead = stream.Read(sizeBytes, 0, 4);
        if (numRead <= 0) {
            break;
        }
        // Convert to int
        size = BitConverter.ToInt32(sizeBytes, 0);
        // Allocate the buffer
        convertedImage = new byte[size];
        stream.Read(convertedImage, 0, size);
        // Do what you will with the array
        listOfArrays.Add(convertedImage);
    } // end while
}

如果所有保存的图像大小相同,则可以取消每个保存的第一个读写调用,并将size硬编码为数组的大小。

答案 2 :(得分:1)

当您回读时如何获得每个图像/字节数组的字节数?

您还需要存储长度(即前4个字节=编码32位的int字节数,后跟数据字节。)

要回读,请读取前四个字节,将其解码回int,然后读取该字节数,重复直到eof。