8 Nisan 2019 Pazartesi

Buffer Sınıfı

BlockCopy metodu
memcpy gibi çalışır. Array.Copy() ile benzerdir. Bu metodu yerine Marshal.Copy() de kullanılabilir.

Örnek
Şöyle yaparız.
Buffer.BlockCopy(src, 0, dst, 0, dst.Length);
Örnek
Şöyle yaparız.
var floatArray1 = new float[] { 123.45f, 123f, 45f, 1.2f, 34.5f };

// create a byte array and copy the floats into it...
var byteArray = new byte[floatArray1.Length * 4];
Buffer.BlockCopy(floatArray1, 0, byteArray, 0, byteArray.Length);
Örnek
İki boyutlu diziyi tek boyutlu diziye kopyalamak için şöyle yaparız.
var ary1 = new int[3,3];
ary1[0, 0] = 0;
ary1[0, 1] = 1;
ary1[0, 2] = 2;
ary1[1, 0] = 3;
ary1[1, 1] = 4;
ary1[1, 2] = 5;
ary1[2, 0] = 6;
ary1[2, 1] = 7;
ary1[2, 2] = 8;

var ary2 = new int[9];

Buffer.BlockCopy(ary1, 0, ary2, 0, 9 * sizeof(int));

Console.WriteLine(string.Join(",", ary2));
Çıktı olarak şunu alırız.
0,1,2,3,4,5,6,7,8
Örnek
Şöyle yaparız.
int[,] original = new int[3, 3]
{
    { 33, 300, 500 },
    { 56, 354, 516 },
    { 65, 654, 489 }
};

int[] target = new int[3];
int rowIndex = 1; 
int columnNo = original.GetLength(1); 
Buffer.BlockCopy(original,
                 rowIndex * columnNo * sizeof(int),
                 target, 
                 0,
                 columnNo * sizeof(int));
target dizisine şunlar kopyalanır.
56, 354, 516
Örnek
Eğer bir string'in içindeki byte'ları hiçbir encoding'e tabi tutmadan başka bir yere kopyalamak istersek şöyle yaparız.
static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

static string GetString(byte[] bytes)
{
    char[] chars = new char[bytes.Length / sizeof(char)];
    System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
    return new string(chars);
}


Hiç yorum yok:

Yorum Gönder