HOWTO · Csharp
Cómo inicializar una matriz de bytes en C#
Aprenda a crear una matriz de bytes de una longitud específica en C#, establecer sus valores y copiar bytes sin procesar.
En esta página
Un byte[] de C# almacena valores de byte de 0 a 255. Use new byte[length] para crear una matriz cuyos elementos contienen inicialmente cero, o use un inicializador de matriz cuando los valores ya se conocen. Un bucle, Array.Fill y LINQ pueden asignar valores repetidos o calculados; Buffer.BlockCopy sirve para copiar bytes ya almacenados en matrices.
Crear una matriz de bytes con una longitud fija o valores explícitos
Para crear un byte[] de tamaño fijo, pase su longitud a new byte[length]. El tiempo de ejecución inicializa cada elemento a cero. Cuando conozca los valores de antemano, escríbalos en un inicializador en su lugar. Un bucle es útil cuando cada valor depende de su índice u otro cálculo.
Las declaraciones siguientes muestran dos formas comunes una al lado de la otra. La primera reserva cuatro posiciones y la segunda enumera tres valores de byte directamente. El bucle luego recorre cada posición en orden y almacena un valor basado en su índice. Length proporciona el número de posiciones, por lo que la misma forma de bucle se adapta cuando cambia el tamaño solicitado. Las líneas finales imprimen ambas matrices para que pueda comparar los valores producidos por cada forma.
using System;
class Program
{
static void Main()
{
byte[] values = new byte[4];
byte[] explicitValues = { 0x10, 0x20, 0x30 };
for (int i = 0; i < values.Length; i++)
{
values[i] = (byte)(i + 1);
}
Console.WriteLine(string.Join(", ", values));
Console.WriteLine(string.Join(", ", explicitValues));
}
}
1, 2, 3, 4
16, 32, 48
Para la primera matriz, el bucle almacena 1, 2, 3 y 4. El inicializador explícito crea una matriz separada que contiene los valores de byte hexadecimales enumerados.
Establecer cada elemento en el mismo valor
Use Array.Fill cuando el framework de destino del proyecto lo proporcione. Asigna un valor de byte a cada elemento de la matriz especificada. Si esa API no está disponible para el proyecto, un bucle for sobre la Length de la matriz proporciona la misma asignación.
using System;
class Program
{
static void Main()
{
byte[] buffer = new byte[4];
Array.Fill(buffer, (byte)255);
Console.WriteLine(string.Join(", ", buffer));
}
}
255, 255, 255, 255
La conversión hace explícito el tipo del valor. Un byte puede contener valores de 0 a 255.
Crear una matriz a partir de un valor repetido con LINQ
Enumerable.Repeat produce una secuencia que contiene un valor el número de veces solicitado. Llame a ToArray para materializar esa secuencia como un byte[]. El ejemplo importa System.Linq, que proporciona ambos métodos.
using System;
using System.Linq;
class Program
{
static void Main()
{
byte value = 42;
int length = 5;
byte[] values = Enumerable.Repeat(value, length).ToArray();
Console.WriteLine(string.Join(", ", values));
}
}
42, 42, 42, 42, 42
Este enfoque es legible cuando una nueva matriz debe contener el mismo valor en su totalidad. Use Array.Fill cuando ya tenga una matriz para actualizar.
Copiar bytes sin procesar con Buffer.BlockCopy
Buffer.BlockCopy copia bytes sin procesar entre matrices cuyos tipos de elementos son tipos primitivos, como byte[] o int[]. Sus desplazamientos de origen y destino y su count se miden en bytes, no en elementos de la matriz. Asegúrese de que los rangos de origen y destino tengan suficiente espacio para la copia solicitada. No genera ni rellena un valor general; para esa tarea, use un bucle o Array.Fill.
Este ejemplo copia cuatro bytes de una matriz de bytes de origen a una matriz de destino comenzando en el desplazamiento de byte uno.
using System;
class Program
{
static void Main()
{
byte[] source = { 10, 20, 30, 40 };
byte[] destination = new byte[6];
Buffer.BlockCopy(source, 0, destination, 1, source.Length);
Console.WriteLine(string.Join(", ", destination));
}
}
0, 10, 20, 30, 40, 0
Al copiar bytes de una matriz numérica más grande, el recuento de copia y los desplazamientos siguen usando bytes. Por ejemplo, esto copia los primeros cuatro bytes de dos valores int en un destino de cuatro bytes:
using System;
class Program
{
static void Main()
{
int[] numbers = { 0x01020304, 0x05060708 };
byte[] bytes = new byte[4];
Buffer.BlockCopy(numbers, 0, bytes, 0, bytes.Length);
Console.WriteLine(string.Join(", ", bytes));
}
}
El ejemplo de la matriz numérica depende de la plataforma: el orden de los bytes en cada int depende de la representación de la plataforma. En el entorno proporcionado, este ejemplo produjo 4, 3, 2, 1; ese orden observado es específico de la representación de bytes de enteros de la plataforma y no es universal. Copiar desde un byte[] evita esa interpretación porque sus elementos ya son bytes.
Elegir un método de inicialización
Use new byte[length] cuando necesite una matriz de tamaño fijo inicializada con ceros, y un inicializador para una lista corta de valores conocidos. Use un bucle para valores calculados por posición, Array.Fill para asignar un valor a una matriz existente, o Enumerable.Repeat(...).ToArray() para construir una matriz de valor repetido con LINQ. Elija Buffer.BlockCopy cuando los datos ya existan como bytes sin procesar en matrices y necesiten copiarse.