当前位置: 首页 > 编程语言 > C#

如何在C#中高效获取字节数组的子集(前N个元素)?分享

时间:2023-04-10 23:31:19 C#

C#中如何高效获取字节数组的子集(前N个元素)?我有一个最大大小为1K的字节数组缓冲区。我想写出数组的一个子集(子集的开头总是元素0,但我们感兴趣的长度是一个变量)。这里的应用是压缩。我将缓冲区传递给压缩函数。为简单起见,假设压缩将导致数据等于或小于1K字节。字节[]缓冲区=新字节[1024];while(true){uncompressedData=GetNextUncompressedBlock();intcompressedLength=压缩(缓冲区,未压缩数据);//在这里,compressedBuffer[0..compressedLength-1]是我们感兴趣的//现在有一个带有签名Write(byte[]compressedData)的方法//我将无法更改。除了分配自定义大小的缓冲区,//并将数据复制到自定义大小的缓冲区中...还有其他//我可以用来只公开我想要的数据的技术吗?我真的想避免在这里复制-似乎完全没有必要,因为所有需要的数据都已经在缓冲区中了。如果你不能改变方法签名,你就被卡住了。您不能在byte[]类型的字节数组上创建“视图”。理想的解决方案是采用ArraySegment或byte[]后跟偏移量和计数的操作。如果您真的不能更改Write方法,那么不幸的是您将不得不创建一个新数组并将数据复制到其中。Buffer.BlockCopy将是我的选择。微软示例:http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspxconstintINT_SIZE=4;int[]arr={2,4,6,8,10,12,14,16,18,20};Buffer.BlockCopy(arr,3*INT_SIZE,arr,0*INT_SIZE,4*INT_SIZE);foreach(intvalueinarr)Console.Write("{0}",value);//该示例显示以下输出://8101214101214161820您的代码将如下所示:uncompressedData=GetNextUncompressedBlock();intcompressedLength=压缩(缓冲区,未压缩数据);Buffer.BlockCopy(缓冲区,0,缓冲区,0,压缩长度);你不能那样做。Array.Resize而不是改变数组的长度,只是将它复制到一个新的数组实例。但是,您可以使用性能更好的Buffer类:Buffer提供了将字节从一个原始数组复制到另一个原始数组、从数组中获取字节、设置数组中的字节以及获取数组长度方法的函数。与System.Array类中的类似方法相比,此类在处理基元类型方面提供了更好的性能。这符合您的需要,因为您有一个字节数组,而字节是原始类型。byte[]b=newByte[]{1,2,3,4,5};IEnumerablemiddle=b.Skip(2).Take(3);这应该让你得到你喜欢的任何中间。它可能是重复的,但我认为你不应该试图避免这种情况。如果方法签名是(byte[]),那么除了复制你什么也做不了。如果可以更改签名:以上是C#学习教程:Howtoefficientlygetasubsetofabytearray(firstNelements)inC#?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: