HOWTO · Csharp
C#에서 바이트 배열을 초기화하는 방법
C#에서 특정 길이의 바이트 배열을 만들고, 그 값을 설정하고, 원시 바이트를 복사하는 방법을 알아봅니다.
이 페이지의 내용
C# byte[]는 0부터 255까지의 바이트 값을 저장합니다. 요소가 처음에 0을 포함하는 배열을 만들려면 new byte[length]를 사용하고, 값을 이미 알고 있는 경우에는 배열 초기화 식을 사용합니다. 루프, Array.Fill, LINQ는 반복되거나 계산된 값을 할당할 수 있으며, Buffer.BlockCopy는 이미 배열에 저장된 바이트를 복사하기 위한 것입니다.
고정 길이 또는 명시적 값으로 바이트 배열 만들기
고정 크기의 byte[]를 만들려면 그 길이를 new byte[length]에 전달합니다. 런타임은 각 요소를 0으로 초기화합니다. 값을 미리 알고 있는 경우 대신 초기화 식에 작성합니다. 루프는 각 값이 인덱스나 다른 계산에 따라 달라질 때 유용합니다.
아래 선언은 두 가지 일반적인 형식을 나란히 보여줍니다. 첫 번째는 네 개의 위치를 예약하고, 두 번째는 세 개의 바이트 값을 직접 나열합니다. 그런 다음 루프는 각 위치를 순서대로 방문하여 인덱스를 기반으로 값을 저장합니다. Length는 위치 수를 제공하므로 요청된 크기를 변경해도 같은 루프 형태를 적용할 수 있습니다. 마지막 줄은 두 배열을 모두 출력하므로 각 형식으로 생성된 값을 비교할 수 있습니다.
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
첫 번째 배열의 경우 루프는 1, 2, 3, 4를 저장합니다. 명시적 초기화 식은 나열된 16진수 바이트 값을 포함하는 별도의 배열을 만듭니다.
모든 요소를 같은 값으로 설정하기
프로젝트의 대상 프레임워크가 제공하는 경우 Array.Fill을 사용합니다. 지정된 배열의 모든 요소에 하나의 바이트 값을 할당합니다. 해당 API를 프로젝트에서 사용할 수 없는 경우 배열의 Length에 대한 for 루프가 동일한 할당을 제공합니다.
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
캐스트는 값의 형식을 명시적으로 만듭니다. 바이트는 0부터 255까지의 값을 가질 수 있습니다.
LINQ로 반복되는 값에서 배열 만들기
Enumerable.Repeat는 요청된 횟수만큼 값을 포함하는 시퀀스를 생성합니다. ToArray를 호출하여 해당 시퀀스를 byte[]로 구체화합니다. 예제에서는 두 메서드를 모두 제공하는 System.Linq를 가져옵니다.
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
이 접근 방식은 새 배열 전체에 같은 값이 포함되어야 할 때 읽기 쉽습니다. 이미 업데이트할 배열이 있는 경우 Array.Fill을 사용합니다.
Buffer.BlockCopy로 원시 바이트 복사하기
Buffer.BlockCopy는 byte[] 또는 int[]와 같이 요소 형식이 기본 형식인 배열 간에 원시 바이트를 복사합니다. 소스 및 대상 오프셋과 count는 배열 요소가 아닌 바이트 단위로 측정됩니다. 소스 및 대상 범위에 요청된 복사에 충분한 공간이 있는지 확인합니다. 일반적인 값을 생성하거나 채우지는 않습니다. 해당 작업에는 루프 또는 Array.Fill을 사용합니다.
이 예제는 소스 바이트 배열에서 4바이트를 바이트 오프셋 1부터 시작하는 대상 배열로 복사합니다.
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
더 큰 숫자 배열에서 바이트를 복사할 때도 복사 개수와 오프셋은 여전히 바이트를 사용합니다. 예를 들어, 이는 두 개의 int 값에서 처음 4바이트를 4바이트 대상으로 복사합니다.
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));
}
}
숫자 배열 예제는 플랫폼에 따라 다릅니다. 각 int의 바이트 순서는 플랫폼의 표현 방식에 따라 달라집니다. 제공된 환경에서 이 예제는 4, 3, 2, 1을 생성했습니다. 관찰된 순서는 플랫폼의 정수 바이트 표현에 특정한 것이며 보편적이지 않습니다. byte[]에서 복사하면 그 요소가 이미 바이트이므로 이러한 해석을 피할 수 있습니다.
초기화 방법 선택하기
0으로 초기화된 고정 크기 배열이 필요할 때는 new byte[length]를 사용하고, 알려진 값의 짧은 목록에는 초기화 식을 사용합니다. 위치별로 계산되는 값에는 루프를, 기존 배열에 하나의 값을 할당하려면 Array.Fill을, LINQ로 반복 값 배열을 구성하려면 Enumerable.Repeat(...).ToArray()를 사용합니다. 데이터가 이미 배열에 원시 바이트로 존재하고 복사해야 할 때는 Buffer.BlockCopy를 선택합니다.