Cómo usar la clase Buffer en C #

Un búfer es una secuencia de bytes en la memoria y el búfer es la manipulación de datos que residen en la memoria. En .NET, el almacenamiento en búfer se refiere a la manipulación de la memoria no administrada, que se representa como una matriz de bytes. 

Es posible que desee aprovechar la clase System.Buffer en .NET siempre que necesite escribir datos en la memoria directamente o cuando desee manipular los datos almacenados en la memoria no administrada. Este artículo habla sobre cómo podemos trabajar con la clase Buffer en C #. 

Para trabajar con los ejemplos de código proporcionados en este artículo, debe tener Visual Studio 2019 instalado en su sistema. Si aún no tiene una copia, puede descargar Visual Studio 2019 aquí.

Crear un proyecto de aplicación de consola .NET Core en Visual Studio

En primer lugar, creemos un proyecto de aplicación de consola .NET Core en Visual Studio. Suponiendo que Visual Studio 2019 esté instalado en su sistema, siga los pasos que se describen a continuación para crear un nuevo proyecto de aplicación de consola .NET Core en Visual Studio.

  1. Inicie el IDE de Visual Studio.
  2. Haga clic en "Crear nuevo proyecto".
  3. En la ventana "Crear nuevo proyecto", seleccione "Aplicación de consola (.NET Core)" en la lista de plantillas que se muestran.
  4. Haga clic en Siguiente.
  5. En la ventana "Configure su nuevo proyecto" que se muestra a continuación, especifique el nombre y la ubicación del nuevo proyecto.
  6. Haga clic en Crear.

Esto creará un nuevo proyecto de aplicación de consola .NET Core en Visual Studio 2019. Usaremos este proyecto en las secciones siguientes de este artículo.

Métodos de la clase Buffer en .NET

La clase Buffer contiene los siguientes métodos:

  • BlockCopy (Array, Int32, Array, Int32) se utiliza para copiar una matriz de origen desde un desplazamiento especificado a una matriz de destino en un desplazamiento especificado.
  • ByteLength (Array) devuelve el número total de bytes en una matriz, es decir, la longitud de la matriz.
  • GetByte (Array, Int32) se usa para recuperar un byte en una ubicación específica en una matriz.
  • SetByte (Array, Int32, Byte) se usa para establecer un byte en una ubicación determinada en la matriz.
  • MemoryCopy (Void *, Void *, Int64, Int64) y MemoryCopy (Void *, Void *, UInt64, UInt64) se utilizan para copiar una cantidad de bytes desde una dirección de origen en la memoria a otra dirección.

Usando matrices y búferes en C #

Antes de comenzar a trabajar con la clase Buffer y sus miembros, exploremos la clase Array perteneciente al espacio de nombres System. La clase Array contiene un método llamado Copy () que se puede usar para copiar el contenido de una matriz a otra.

La clase Buffer en el espacio de nombres System contiene un método llamado BlockCopy () que hace lo mismo. Puede usar BlockCopy () para copiar el contenido de una matriz de origen en una matriz de destino. Cabe señalar que el método Buffer.BlockCopy es mucho más rápido que el método Array.Copy. La clase Buffer también contiene otros métodos como ByteLength, GetByte y SetByte.

Tenga en cuenta que el método BlockCopy no copia los elementos de una matriz de origen. Más bien, BlockCopy copia una secuencia de bytes de la matriz de origen a la matriz de destino.

Copie bytes entre dos matrices en C #

Puede aprovechar el método Buffer.BlockCopy para copiar bytes entre una matriz de origen y una matriz de destino, como se muestra en el fragmento de código que se proporciona a continuación.

vacío estático Main ()

{

  corto [] arr1 = nuevo corto [] {1, 2, 3, 4, 5};

  corto [] arr2 = nuevo corto [10];

  int sourceOffset = 0;

  int destinationOffset = 0;

  int count = 2 * sizeof (corto);

  Buffer.BlockCopy (arr1, sourceOffset, arr2, destinationOffset, count);

  para (int i = 0; i <arr2.Length; i ++)

  {

      Console.WriteLine (arr2 [i]);

  }

  Console.ReadKey ();

}

Cuando ejecuta el programa anterior, así es como se vería la salida en la ventana de la consola.

Encuentre la longitud de bytes de una matriz en C #

Para averiguar la longitud de una matriz, puede aprovechar el método ByteLength de la clase Buffer como se muestra en el ejemplo de código que se muestra a continuación.

vacío estático Main ()

{

  corto [] arr1 = nuevo corto [] {1, 2, 3, 4, 5};

  corto [] arr2 = nuevo corto [10];

  Console.WriteLine ("La longitud del arr1 es: {0}",

  Buffer.ByteLength (arr1));

  Console.WriteLine ("La longitud del arr2 es: {0}",

  Buffer.ByteLength (arr2));

  Console.ReadKey ();

}

Cuando ejecuta el programa anterior, así es como se vería la salida:

Los métodos SetByte y GetByte de la clase Buffer se pueden usar para configurar o leer bytes individuales hacia y desde una matriz, respectivamente. El siguiente fragmento de código ilustra cómo se pueden usar los métodos SetByte y GetByte.

vacío estático Main ()

{

corto [] arr1 = {5, 25};

int length = Buffer.ByteLength (arr1);

Console.WriteLine ("\ nLa matriz original es la siguiente: -");

para (int i = 0; i <longitud; i ++)

{

      byte b = Buffer.GetByte (arr1, i);

      Console.WriteLine (b);

}

Buffer.SetByte (arr1, 0, 100);

Buffer.SetByte (arr1, 1, 100);

Console.WriteLine ("\ nLa matriz modificada es la siguiente: -");

para (int i = 0; i <Buffer.ByteLength (arr1); i ++)

{

      byte b = Buffer.GetByte (arr1, i);

      Console.WriteLine (b);

}

    Console.ReadKey ();

}

Cuando ejecuta el programa anterior, así es como aparecería la salida.

La clase Buffer proporciona un rendimiento mucho mejor al manipular una región de memoria que contiene tipos primitivos. Debe aprovechar la clase Buffer siempre que necesite manipular datos en la memoria y siempre que necesite un acceso rápido a los datos almacenados en la memoria.

Cómo hacer más en C #:

  • Cómo usar HashSet en C #
  • Cómo usar parámetros opcionales y con nombre en C #
  • Cómo comparar el código C # usando BenchmarkDotNet
  • Cómo usar interfaces fluidas y encadenamiento de métodos en C #
  • Cómo realizar pruebas unitarias de métodos estáticos en C #
  • Cómo refactorizar objetos de Dios en C #
  • Cómo usar ValueTask en C #
  • Cómo utilizar la inmutabilidad en C
  • Cómo usar const, readonly y static en C #
  • Cómo usar anotaciones de datos en C #
  • Cómo trabajar con GUID en C # 8
  • Cuándo usar una clase abstracta frente a una interfaz en C #
  • Cómo trabajar con AutoMapper en C #
  • Cómo usar expresiones lambda en C #
  • Cómo trabajar con delegados Action, Func y Predicate en C #
  • Cómo trabajar con delegados en C #
  • Cómo implementar un registrador simple en C #
  • Cómo trabajar con atributos en C #
  • Cómo trabajar con log4net en C #
  • Cómo implementar el patrón de diseño del repositorio en C #
  • Cómo trabajar con la reflexión en C #
  • Cómo trabajar con filesystemwatcher en C #
  • Cómo realizar la inicialización diferida en C #
  • Cómo trabajar con MSMQ en C #
  • Cómo trabajar con métodos de extensión en C #
  • Cómo usar expresiones lambda en C #
  • Cuándo usar la palabra clave volátil en C #
  • Cómo usar la palabra clave yield en C #
  • Cómo implementar polimorfismo en C #
  • Cómo construir su propio programador de tareas en C #
  • Cómo trabajar con RabbitMQ en C #
  • Cómo trabajar con una tupla en C #
  • Explorando métodos virtuales y abstractos en C #
  • Cómo usar Dapper ORM en C #
  • Cómo usar el patrón de diseño flyweight en C #