byte[]字节数组处理问题

sakuragilyb 2017-11-29 07:40:20
需要把指定字节数组删除掉不必要的字节,保留需要的字节,原字节数组比较大:40434768字节长度,
删除保留的规则是:4096字节为一段,每段去掉前面24个字节,保留后面4072个字节,最后把所有的4072字节连接起来,我自己写的方法是:

private byte[] RemoveBytes(byte[] _originalBytes)
{
byte[] resBytes = new byte[0];
int nums = _originalBytes.Length / 4096;
for (int i = 0; i < nums ; i++)
{
resBytes = resBytes.Concat(_originalBytes.Skip(4096 * i + 24).Take(4072).ToArray()).ToArray();
}
resBytes = resBytes.Concat(_originalBytes.Skip(24 + nums * 4096).ToArray()).ToArray();
return resBytes;
}

但这样计算非常慢,几个小时都没得出结果,有没有谁能提供快速的算法?
...全文
230 8 点赞 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xuzuning 2017-11-30
虽然 Array.Copy(实测100ms)要比 Linq(实测900ms)要快 但是计算目标数组的规模,还是十分绕人的 var b = new byte[a.Length * 4072 + (a.Length % 4096) % 4072-24];
  • 打赏
  • 举报
回复
wanghui0380 2017-11-30
当然也有最简单直白的玩法,不必做任何花哨的技巧,只是简简单单几句话 private static IEnumerable<byte> RemoveBytes(byte[] _originalBytes) { for (int i = 0; i < _originalBytes.Length; i++) { if (i%4096>=24) { yield return _originalBytes[i]; } } } var res = RemoveBytes(source).ToArray(); 这就是结果
  • 打赏
  • 举报
回复
wanghui0380 2017-11-30
Array.Copy是正解,不过需要注意边界 当然也有不那么正经的解法,按照你的要求,我们来个不正经的 _originalBytes.Select((p,index)=>new {p,index}).Where(p=>p.index % 4096>=24).Select(p=>p.p).ToArray()
  • 打赏
  • 举报
回复
bloodish 2017-11-30
处理字节数组,可以考虑用MemoryStream,我相信效率会更好.

private byte[] RemoveBytes(byte[] _originalBytes)
        {
            const int length = 4072;
            const int block = 4096;
            var offset = 24;
            var nums = _originalBytes.Length / block;
            using (MemoryStream ms = new MemoryStream())
            {
                for (var i = 0; i < nums; i++)
                {
                    ms.Write(_originalBytes, offset, length);
                    offset += block;
                }
                return ms.ToArray();
            }
        }
另外可以考虑并发分段处理,最后合并结果, Map then reduce.
  • 打赏
  • 举报
回复
xuzuning 2017-11-29
比如这样
            var a = new byte[40434768];
            int len = a.Length / 4096;
            var b = new byte[(len+1) * 4072];
            for (int i = 24, j = 0; i < a.Length; i += 4096, j += 4072)
            {
                Array.Copy(a, i, b, j, 4072);
            }
可能会有 源数组长度不足 的异常,记得判断处理一下
  • 打赏
  • 举报
回复
xuzuning 2017-11-29
Array.Copy
  • 打赏
  • 举报
回复
相关推荐
发帖
C#
加入

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2017-11-29 07:40
社区公告

让您成为最强悍的C#开发者