如何从文件中读取多个字节数组?这些字节数组是图像,可能很大。
这就是我将它们添加到文件中的方式:
using (var stream = new FileStream(tempFile, FileMode.Append))
{
//convertedImage = one byte array
stream.Write(convertedImage, 0, convertedImage.Length);
}
所以,现在他们在tempFile
,我不知道如何将它们作为单独的数组检索。理想情况下,我希望将它们作为IEnumerable<byte[]>
。有没有办法拆分它们,也许?
答案 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。