我试图将图像文件读取为字节,然后将这些字节分成较小的块,如下面的代码所示。有人可以指导我这样做是否正确和有效吗?请帮忙。
public static IEnumerable<IEnumerable<char>> ReadByChunk(int chunkSize)
{
IEnumerable<char> result;
int startByte = 0;
do
{
result = ReadBytes(startByte, chunkSize);
startByte += chunkSize;
yield return result;
}
while (result.Any());
}
public static IEnumerable<char> ReadBytes(int startByte, int byteToRead)
{
char[] result;
byte[] b = File.ReadAllBytes(@"C:\Users\1.jpg");
for (int i = startbyte; i <= b.length; i++)
{
result = b;
}
return result;
}
public static void Main()
{
const int chunkSize = 2048;
foreach (IEnumerable<byte> bytes in ReadByChunk(chunkSize))
{
//more code
}
}
答案 0 :(得分:2)
您的代码有很多问题:
ReadBytes
都会将整个文件读入内存。for
中的ReadBytes
循环实际上并不对结果进行分块,它只是将b
分配给result
,这意味着此方法的结果始终是整个文件。char
用于二进制数据。这不是一个好主意,因为文本编码不适用于二进制数据。例如,使用UTF8对任意字节序列进行编码,然后反转将无法获得相同的字节值。ReadBytes
始终返回整个文件,因此while (result.Any())
将永远循环(除非文件为空)。这是一种更正确的方法:
public static IEnumerable<IEnumerable<byte>> ReadByChunk(int chunkSize)
{
using (var reader = File.OpenRead("filename")) // open the file as a stream
{
byte[] chunk = new byte[chunkSize]; // create a byte array equal to our chunkSize
int bytesRead = 0;
// when `Read` returns `0`, it means we've reached the end of the file
// so loop while the number of bytes read is > 0
while ((bytesRead = reader.Read(chunk, 0, chunkSize)) > 0)
{
// take the actual number of bytes read and return
// this chunk as an array
yield return chunk.Take(bytesRead).ToArray();
}
}
}