본문 바로가기

웹 개발/네트워크

[C#] TCP/IP 소켓 프로그래밍_ 직렬화, 바이트 오더

직렬화

  • 직렬화

      - 메모리상에 있는 객체를 전송/ 저장 가능한 형태로 만드는 것

      - 소켓통신에서는 바이트를 많이 사용

 

  • 역직렬화

      - 직렬화된 데이터를 다시 객체의 형태로 만드는 것

        //직렬화
        int num = 123;
        byte[] buffer = BitConverter.GetBytes(num);

        //역직렬화
        //buffer라는 바이트 배열을 0번째 인덱스부터 시작해서 4바이트를 읽으라는 의미
        int num2 = BitConverter.ToInt32(buffer, 0);

 

- long 타입을 사용한 예제

  long은 8byte 짜리 자료형이므로 버퍼의 길이는 8이 나온다.

        //직렬화
        long num = 123;
        byte[] buffer = BitConverter.GetBytes(num);
        Console.WriteLine(buffer.Length);

        //역직렬화
        long num2 = BitConverter.ToInt64(buffer, 0);
        Console.WriteLine(num2);

결과

- string 타입을 사용한 예제

        //string
        //직렬화
        string str = "Hello world";
        //문자열을 직렬화할 때는 BitConverter가 아닌 Encoding사용
        byte[] buffer2 = Encoding.UTF8.GetBytes(str);
        Console.WriteLine(buffer2.Length);
        //역직렬화
        string str2 = Encoding.UTF8.GetString(buffer2);
        Console.WriteLine(str2);

결과

 

바이트 오더

바이트 오더 : 바이트를 메모리에 저장하는 순서

1. 리틀엔디언 : 하위 바이트부터 저장

2. 빅엔디언 : 상위 바이트부터 저장

 

* 리틀엔디언 시스템에서 데이터를 보내고 빅엔디언에서 받는다면 

데이터를 정상적으로 가져올 수 없다. 

데이터 통신을 할 때는 빅엔디언 방식을 사용한다.

 

        //리틀엔디언
        byte[] buffer = BitConverter.GetBytes(1234567);
        Console.WriteLine(BitConverter.ToString(buffer));

        // 빅엔디언
        int num = IPAddress.HostToNetworkOrder(1234567);

        byte[] buffer2 = BitConverter.GetBytes(num);
        Console.WriteLine(BitConverter.ToString(buffer2));

결과