본문 바로가기
개발 이야기/C# 이야기

C# .Net Array.Copy() 바이트 복사

by 런던살자 2020. 3. 23.

안녕하세요 마블랑입니다.

 

윈도우에서 소켓통신이나 시리얼 통신 등 통신 프로그램을 만들때 보통 바이트 단위로 데이터를 주고 받습니다.

 

그래서 바이트 단위로 데이터를 잘 다룬다면 어렵게 느껴지는 통신프로그램이 쉽게 느껴질것입니다.

 

바이트 배열로 데이터를 받으면 보통 이 데이터는 여러가지 데이터가 담겨져 있습니다.

 

그래서 바이트 배열을 정해진 길이만큼 잘라서 써야 하는데요

 

C#에서는 Array 클래스를 이용하면 바이트를 필요한만큼 잘라서 쓰는것이 굉장히 쉽습니다~

 

배열을 잘라쓰기 위해 사용해야하는 함수 말고도 Array클래스의 유용한 함수도 알아보겠습니다~ (아래 예제 코드에 포함된 함수들입니다~)

 

 

1. Array.Copy(byte[] source, int sourceIndex, byte[] destination, int destinationIndex, int length)

 

이번 포스팅의 핵심 함수인데요.

 

매개변수를 보면 첫번쨰와 세번째 인자에 배열이 두개 들어갑니다. 첫번째 인자 배열은 기존에 데이터가 담겨져 있는 즉,복사를 원하는 배열입니다. 세번째 인자의 배열은 복사된 데이터를 저장할 배열입니다. 

 

그리고 두번째 매개변수는 첫번째 배열의 복사를 시작할 인덱스를 넣어주면 되고 네번째 매개변수는 복사할 데이터를 담기 원하는 인덱스를 넣으면 됩니다. 보통 새로운 배열에 저장을 한다면 0을 넣어줘야 합니다~

 

마지막 다섯번쨰 인자는 복사할 길이를 넣어주면 됩니다.

 

설명만 들어서는 어려우니 아래에 예제를 참고하시기 바랍니다~

 

 

2. Array.Clear(byte[] array, int index, int length)

 

배열을 선언하고 쓰레기 값들이나 기존 데이터를 초기화 할때 사용합니다.

 

index로 지정된 부분부터 length만큼 초기화 합니다.

 

 

3. Array.Sort(byte[] array)

 

배열 안에 있는 데이터들을 오름차순으로 정렬할때 사용합니다.

 

기본값이 오름차순이고 매개변수는 없어 내림차순을 구현할때는 

 

Array.Reverse(byte[] array) 함수를 사용하면 됩니다~

 

 

먼저 예제 코드를 살펴보겠습니다~

 

예제코드는 바이트 배열에서 헤더(길이 : 7)인 부분을 먼저 분리시키고 바디(길이 : 5)를 동일한 길이만큼 잘라서 출력하는 예제입니다.

 

    class Program
    {
        static void Main(string[] args)
        {
            byte[] arrTemp = new byte[32] { 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };

            Array.Sort(arrTemp);	//오름차순 정렬

            Array.Reverse(arrTemp); //배열을 뒤집어 내림차순 정렬

            int nBodyPartSize = 5; //바디 사이즈
            int IndexOffset = 0;   //바디를 복사하고 난뒤에 다음 오프셋
            byte[] ArrayHeader = new byte[7]; //헤더를 저장할 배열 (길이 : 7)

            int nCountBodyPart = (arrTemp.Length - ArrayHeader.Length) / nBodyPartSize; //바디 개수 구하기
            byte[] ArrayBody = new byte[nBodyPartSize]; //바디를 저장할 배열 선언 (길이 : 5)


            Array.Clear(ArrayHeader, 0, ArrayHeader.Length); //배열을 초기화 
            Array.Clear(ArrayBody, 0, ArrayBody.Length);//배열을 초기화


            Array.Copy(arrTemp, IndexOffset, ArrayHeader, 0, ArrayHeader.Length);//헤더 복사

            IndexOffset += ArrayHeader.Length;//헤더 길이 만큼 오프셋 이동

            Console.WriteLine("----------------------------------Header------------------------------------------------");
            Console.WriteLine(ArrayHeader[0] + " " + ArrayHeader[1] + " " + ArrayHeader[2] + " " + ArrayHeader[3] + " " + ArrayHeader[4] + " " + ArrayHeader[5] + " " + ArrayHeader[6]); //헤더 출력
            Console.WriteLine("----------------------------------Body--------------------------------------------------");
            for (int i = 0; i < nCountBodyPart; i++) //바디 개수만큼 반복문 실행
            {
                Array.Copy(arrTemp, IndexOffset, ArrayBody, 0, nBodyPartSize); //바디 복사

                IndexOffset += nBodyPartSize;//바디길이만큼  오프셋 이동

                Console.WriteLine(ArrayBody[0] + " " + ArrayBody[1] + " " + ArrayBody[2] + " " + ArrayBody[3] + " " + ArrayBody[4]);//바디 출력
            }
            Console.WriteLine("----------------------------------End---------------------------------------------------");
        }
    }

 

자체적으로 샘플코드를 만들어 보았는데 유용했으면 좋겠군요

 

그럼 실행을 해보겠습니다~

 

헤더를 뺴고 바디가 5개가 출력이 됩니다. 

 

어떻게 보면 C언어의 memcpy와 비슷합니다. 

 

 

방금 알아본 Array.Copy()를 사용하지 않는다면 반복문을 수행하여 일일이 복사하는 방법으로 데이터를 분석해야하지만 Array.Copy() 단 한줄로 코드도 간략히 하고 더 간편하니 알아두면 좋을듯 합니다~

 

 

이상 마블랑이었습니다.

 

읽어주어서 고맙습니다.

댓글