我必须做一个读取和成像的程序并将其放入一个字节数组
var Imagenoriginal = File.ReadAllBytes("10M.bmp");
并将该字节数组分成3个不同的数组,以便将这些新数组中的每一个发送到其他计算机(使用管道)在那里处理它们,最后将它们带回原始计算机,最后给出结果。 但我的问题是,如果所选图像的大小不同,我该怎么做一个能够将字节数组分成三个不同字节数组的算法。 感谢您的帮助,祝您度过愉快的一天。 =)
答案 0 :(得分:2)
您可以划分数组的长度,因此您有三个整数n1
,n2
和n3
,所有这些整数总计为array.Length
。然后,使用LINQ的这个片段应该有所帮助:
var arr1 = sourceArray.Take(n1).ToArray();
var arr2 = sourceArray.Skip(n1).Take(n2).ToArray();
var arr3 = sourceArray.Skip(n1+n2).Take(n3).ToArray();
现在,在arr1
,arr2
和arr3
中,您将拥有源数组的三个部分。您需要使用LINQ,因此在代码的开头不要忘记using System.Linq;
。
答案 1 :(得分:1)
您可以尝试这样:
public static IEnumerable<IEnumerable<T>> DivideArray<T>(this T[] array, int size)
{
for (var i = 0; i < (float)array.Length / size; i++)
{
yield return array.Skip(i * size).Take(size);
}
}
这样的电话:
var arr = new byte[] {1, 2, 3, 4, 5,6};
var dividedArray = arr.DivideArray(3);
这是LINQ方法:
public List<List<byte>> DivideArray(List<byte> arr)
{
return arr
.Select((x, i) => new { Index = i, Value = x })
.GroupBy(x => x.Index / 100)
.Select(x => x.Select(v => v.Value).ToList())
.ToList();
}
答案 2 :(得分:0)
您是否考虑过使用Streams
?您可以扩展Stream
类以提供所需的行为,如下所示:
public static class Utilities
{
public static IEnumerable<byte[]> ReadBytes(this Stream input, long bufferSize)
{
byte[] buffer = new byte[bufferSize];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
using (MemoryStream tempStream = new MemoryStream())
{
tempStream.Write(buffer, 0, read);
yield return tempStream.ToArray();
}
}
}
public static IEnumerable<byte[]> ReadBlocks(this Stream input, int nblocks)
{
long bufferSize = (long)Math.Ceiling((double)input.Length / nblocks);
return input.ReadBytes(bufferSize);
}
}
ReadBytes
扩展方法读取input
Stream并使用指定的bufferSize
将其数据作为字节数组序列返回。
ReadBlocks
扩展方法使用适当的缓冲区大小调用ReadBytes
,以便序列中的元素数等于nblocks
。
然后,您可以使用ReadBlocks
来实现您的目标:
public class Program
{
static void Main()
{
FileStream inputStream = File.Open(@"E:\10M.bmp", FileMode.Open);
const int nblocks = 3;
foreach (byte[] block in inputStream.ReadBlocks(nblocks))
{
Console.WriteLine("{0} bytes", block.Length);
}
}
}
注意ReadBytes
如何使用tempStream
和read
在内存中写入从输入流读取的字节,然后再将它们转换为字节数组,它解决了评论中提到的剩余字节的问题。