关键词搜索

源码搜索 ×
×

C# 内存复制和数组复制示例

发布2018-03-22浏览5819次

详情内容

内存复制-Marshal.Copy:

  1. // 复制当前传入的数据
  2. byte[] pcm_src = new byte[len];
  3. // 复制数据到二进制数组
  4. Marshal.Copy(pcm, pcm_src, 0, len);

数组复制-Array.Copy:

  1. // 复制当前传入的数据
  2. byte[] pcm_src = new byte[len];
  3. // 复制数据到二进制数组
  4. Marshal.Copy(pcm, pcm_src, 0, len);
  5. // 复制新传入的数据到新的数组结构
  6. Array.Copy(pcm_src, 0, pcm_dest, bts_left.Length, len)

测试示例:

  1. // 采样数
  2. ushort samples = 320;
  3. // 上次剩余的字节
  4. byte[] bts_left;
  5. class aa
  6. {
  7. public byte[] pcm;
  8. public int len;
  9. }
  10. private List<aa> data = new List<aa>();
  11. public void PlayAudio(IntPtr pcm, int len)
  12. {
  13. lock (this)
  14. {
  15. int samples_len = samples * 2;
  16. if (len == samples_len)
  17. {
  18. byte[] bts = new byte[len];
  19. Marshal.Copy(pcm, bts, 0, len);
  20. data.Add(new aa
  21. {
  22. len = len,
  23. pcm = bts
  24. });
  25. }
  26. else
  27. // 此处解决采样数为1024时分割可以复制数据的大小
  28. {
  29. var len_temp = bts_left ==null? len : len + bts_left.Length;
  30. byte[] pcm_dest = new byte[len_temp];
  31. byte[] bts = new byte[samples_len];
  32. // 复制数据
  33. if (bts_left != null)
  34. {
  35. // 复制长度不够的数据
  36. Array.Copy(bts_left,0, pcm_dest, 0, bts_left.Length);
  37. // 复制当前传入的数据
  38. byte[] pcm_src = new byte[len];
  39. // 复制数据到二进制数组
  40. Marshal.Copy(pcm, pcm_src, 0, len);
  41. // 复制新传入的数据到新的数组结构
  42. Array.Copy(pcm_src, 0, pcm_dest, bts_left.Length, len);
  43. bts_left = null;
  44. }
  45. else
  46. {
  47. Marshal.Copy(pcm, pcm_dest, 0, len_temp);
  48. }
  49. // 获取播放数据
  50. int index = 0,count= len_temp / samples_len;
  51. int startIndex=0;
  52. Console.WriteLine(">>>total:"+ len_temp + ",times:" + count + ",left:" + len_temp % samples_len);
  53. while (index< count)
  54. {
  55. // 复制满足长度的数据
  56. Array.Copy(pcm_dest, startIndex, bts, 0, samples_len);
  57. // 添加数据
  58. data.Add(new aa
  59. {
  60. len = samples_len,
  61. pcm = bts
  62. });
  63. index++;
  64. // 计算下一次的开始位置
  65. startIndex = index * samples_len;
  66. }
  67. // 暂存长度不够的数据
  68. var left_len = len_temp % samples_len;
  69. if (left_len > 0)
  70. {
  71. bts_left = new byte[left_len];
  72. // 复制不够长度的数据
  73. Array.Copy(pcm_dest, startIndex, bts_left, 0, left_len);
  74. }
  75. }
  76. }
  77. //SDL.SDL_Delay(10);
  78. }

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载