Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Sao chép byte array với Buffer.BlockCopy trong C#


Giới thiệu

Buffer.BlockCopy sao chép một khối byte từ mảng nguồn sang mảng đích. Làm việc trên byte level, nhanh hơn copy từng phần tử. Namespace System.

Ví dụ cơ bản

byte[] b1 = { 22, 49 };
byte[] b2 = new byte[5];
Buffer.BlockCopy(b1, 0, b2, 0, 2); // Copy 2 byte từ b1[0] sang b2[0]

Ví dụ hoàn chỉnh

using System;

class Demo
{
    static void Main()
    {
        byte[] b1 = { 22, 49 };
        byte[] b2 = new byte[5];
        Buffer.BlockCopy(b1, 0, b2, 0, 2);
        bufferFunc(b2);
    }

    static void bufferFunc(byte[] a)
    {
        for (int j = 0; j < a.Length; j++)
            Console.Write(a[j]);
        Console.WriteLine();
    }
}

Kết quả

2249000

Tham số BlockCopy

Buffer.BlockCopy(src, srcOffset, dst, dstOffset, byteCount);
  • src: Mảng nguồn (Array)
  • srcOffset: Offset byte trong src
  • dst: Mảng đích (Array)
  • dstOffset: Offset byte trong dst
  • byteCount: Số byte cần copy

Lưu ý quan trọng

  • Làm việc trên byte, không phải phần tử. Với int[], 1 int = 4 byte.
  • Mảng phải là kiểu primitive (bool, byte, char, short, int, long, float, double, ...).
  • Offset tính bằng byte, không phải index phần tử.
  • Không kiểm tra overflow kiểu dữ liệu - copy thô byte.

Ví dụ với int[] (cần tính byte offset)

int[] src = { 1, 2, 3 };
int[] dst = new int[5];
// Copy 2 int đầu = 8 byte
Buffer.BlockCopy(src, 0, dst, 0, 2 * sizeof(int));
// dst = { 1, 2, 0, 0, 0 }

So sánh với Array.Copy

Đặc điểmBuffer.BlockCopyArray.Copy
Đơn vịBytePhần tử
Kiểu mảngChỉ primitiveBất kỳ Array
Ép kiểuKhông (copy thô)Có (có boxing/unboxing)
Hiệu suấtRất nhanh (memcpy)Nhanh