C# 在C语言中将字节[]拆分为多个字节[]数组#

C# 在C语言中将字节[]拆分为多个字节[]数组#,c#,bytearray,C#,Bytearray,我正在尝试将图像的字节“分块”。这将允许我上传一个大的部分图像。我将图像当前存储为一个大字节[]。我想将字节数组拆分为字节[],最大长度为512个元素。然而,我不知道如何以最有效的方式做到这一点 有人知道我怎样才能以最有效的方式做到这一点吗?最有效的方法是:不要这样做。如果已经将映像作为单个字节[],那么对于本地代码,仅指定偏移量和长度(可能是字节的som ArraySegment)通常就足够了。如果你的上传API只需要字节[],那么你仍然不应该把它完全分块;只需使用一个512缓冲区,并使用bu

我正在尝试将图像的字节“分块”。这将允许我上传一个大的部分图像。我将图像当前存储为一个大字节[]。我想将字节数组拆分为
字节[]
,最大长度为512个元素。然而,我不知道如何以最有效的方式做到这一点


有人知道我怎样才能以最有效的方式做到这一点吗?

最有效的方法是:不要这样做。如果已经将映像作为单个字节[],那么对于本地代码,仅指定偏移量和长度(可能是字节的som ArraySegment)通常就足够了。如果你的上传API只需要字节[],那么你仍然不应该把它完全分块;只需使用一个512缓冲区,并使用buffer.BlockCopy加载它,它将加载连续的数据段。您可能需要调整最后一个块的大小(Array.resize),但最多需要2个数组

甚至更好;避免首先需要一个字节[]:考虑通过流API加载数据(如果数据来自一个文件,这将很好地工作);只需使用Read(在循环中,处理返回值等)来填充max 512的块。例如(未经测试,仅用于说明):


我为此编写了一个扩展,最初是针对字符串的,但决定将其改为通用的

    public static T[] CopySlice<T>(this T[] source, int index, int length, bool padToLength = false)
    {
        int n = length;
        T[] slice = null;

        if (source.Length < index + length)
        {
            n = source.Length - index;
            if (padToLength)
            {
                slice = new T[length];
            }
        }

        if(slice == null) slice = new T[n];
        Array.Copy(source, index, slice, 0, n);
        return slice;
    }

    public static IEnumerable<T[]> Slices<T>(this T[] source, int count, bool padToLength = false)
    {
        for (var i = 0; i < source.Length; i += count)
            yield return source.CopySlice(i, count, padToLength);
    }
编辑:我还提供了关于使用Buffer.BlockCopy的SO的答案,但是BlockCopy只在
字节[]
数组上工作,因此字符串的通用版本是不可能的。

公共静态IEnumerable拆分(此字节[]值,int bufferLength){
public static IEnumerable<byte[]> Split(this byte[] value,int bufferLength){
   int countOfArray = value.Length / bufferLength;
   if(value.Length % bufferLength > 0)
      countOfArray ++;
   for(int i=0;i<countOfArray;i++)
   {
      yield return value.Skip(i * bufferLength).Take(bufferLength).ToArray();

   }
}
int countOfArray=value.Length/bufferLength; 如果(value.Length%bufferLength>0) countOfArray++; 对于(int i=0;i 我知道这是旧的,但需要相同的解决方案和以下工作 对我来说太完美了希望这对某人有帮助


您好,请点击这里的链接:我希望它能有所帮助,byeIt提出O(N)解决方案似乎相当简单(通过对所有字节进行一次迭代)。您是否在寻找比O(N)更好的解决方案?类似问题的可能重复不确定名称是否选得那么好。通常,数组切片指的是原始数组的一部分。(类似于
ArraySegment
@CodesInChaos的语义-我对新名称持开放态度…你能推荐一个吗?
copysicle
会非常清楚。或者
Subarray
类似于
Substring
。命名函数太难了…@CodesInChaos-很好。谢谢你+1:)对
byte[]myBytes=new byte[33]不起作用;foreach(byte[]copysicle in myBytes.Slices(16)){..}
看起来很不错,但效率不高。不过,替代解决方案为+1。
byte[] myBytes; // original byte array

foreach(byte[] copySlice in myBytes.Slices(10))
{
    // do something with each slice
}
public static IEnumerable<byte[]> Split(this byte[] value,int bufferLength){
   int countOfArray = value.Length / bufferLength;
   if(value.Length % bufferLength > 0)
      countOfArray ++;
   for(int i=0;i<countOfArray;i++)
   {
      yield return value.Skip(i * bufferLength).Take(bufferLength).ToArray();

   }
}
private byte[][] ByteArrayToChunks(byte[] byteData, long BufferSize)
{
    byte[][] chunks = byteData.Select((value, index) => new { PairNum = Math.Floor(index / (double)BufferSize), value }).GroupBy(pair => pair.PairNum).Select(grp => grp.Select(g => g.value).ToArray()).ToArray();
    return chunks;
}