首页 新闻 会员 周边

如何高效的合并两个Byte数组呢?

0
悬赏园豆:20 [已解决问题] 解决于 2011-12-20 15:23

  如果有byte[] data1 ={0x12,0x13,0x14}; byte[] data2 ={0x15,0x16,0x17}

合并之后变成 data3 = {0x12,0x13,0x14,0x15,0x16,0x17};

个人思路是使用ArrayCopy或者是List<Byte>,但是觉得应该还有更好的实现方式,有哪位知道的还请指点一下哈。

gyzhao的主页 gyzhao | 初学一级 | 园豆:89
提问于:2011-12-12 15:27
< >
分享
最佳答案
1

Array.Copy内部直接调用了windows api实现,已经非常快了。至少FCL中不会有比这个更快的了。还有一个仅仅是在理论上会比它快一点,就是Buffer.BlockCopy:

var all = new byte[data1.Length + data2.Length];
Buffer.BlockCopy(data1, 0, all, 0, data1.Length);
Buffer.BlockCopy(data2, 0, all, data1.Length * sizeof(byte), data2.Length);

说Buffer.BlockCopy理论上稍微快一点点是因为:

//Buffer.Copy本身就是直接的api调用
[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]
public static extern void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count);

//Array.Copy几经辗转最终到了这个方法
[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical, ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
internal static extern void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length, bool reliable);

如果真的有空应该写个小程序测试一下。虽然我认为区分这两者的速度差异真的没什么大意义。

收获园豆:10
水牛刀刀 | 大侠五级 |园豆:6350 | 2011-12-12 15:50
其他回答(3)
1
byte[] data1 = {0x12, 0x13, 0x14};
byte[] data2 = {0x15, 0x16, 0x17};

var data3 = new byte[data1.Length + data2.Length];
Stream s = new MemoryStream();
s.Write(data1, 0, data1.Length);
s.Write(data2, 0, data2.Length);
s.Position = 0;
int r = s.Read(data3, 0, data3.Length);
if (r > 0)
{
//此时data3中就是合并的值了
}
收获园豆:10
LCM | 园豆:6876 (大侠五级) | 2011-12-12 15:39
2

一楼的方法使用了stream,相应的会有一定开销。

二楼的方法直接操作buffer,相对于stream开销少很多。

小数据,二楼的方法效率会高些。

大数据,最好还是用一楼的方法。

胡屯 | 园豆:714 (小虾三级) | 2011-12-13 09:30
0
Weiseditor | 园豆:74 (初学一级) | 2016-10-25 14:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册