"xdrlib" --- XDR 데이터 인코딩과 디코딩
***************************************

**소스 코드:** Lib/xdrlib.py

======================================================================

"xdrlib" 모듈은 1987년 6월에 Sun Microsystems, Inc.가 작성한 **RFC
1014**에 설명된 외부 데이터 표현 표준(External Data Representation
Standard)을 지원합니다. 이 모듈은 RFC에 설명된 대부분의 데이터형을 지
원합니다.

"xdrlib" 모듈은 두 개의 클래스를 정의합니다. 하나는 변수를 XDR 표현으
로 패킹하고, 다른 하나는 XDR 표현으로부터 언 패킹합니다. 또한, 두 가지
예외 클래스가 있습니다.

class xdrlib.Packer

   "Packer"는 데이터를 XDR 표현으로 패킹하는 클래스입니다. "Packer" 클
   래스는 인자 없이 인스턴스화됩니다.

class xdrlib.Unpacker(data)

   "Unpacker"는 문자열 버퍼에서 XDR 데이터값을 언 패킹하는 반대 클래스
   입니다. 입력 버퍼는 *data*로 주어집니다.

더 보기:

  **RFC 1014** - XDR: External Data Representation Standard
     이 RFC는 이 모듈이 처음 작성되었을 당시에 XDR이었던 데이터의 인코
     딩을 정의합니다. **RFC 1832**로 개정되었습니다.

  **RFC 1832** - XDR: External Data Representation Standard
     XDR의 개정된 정의를 제공하는 최신 RFC


Packer 객체
===========

"Packer" 인스턴스에는 다음과 같은 메서드가 있습니다:

Packer.get_buffer()

   현재의 팩 버퍼를 문자열로 반환합니다.

Packer.reset()

   팩 버퍼를 빈 문자열로 재설정합니다.

일반적으로, 적절한 "pack_type()" 메서드를 호출하여 가장 자주 쓰이는
XDR 데이터형을 팩할 수 있습니다. 각 메서드는 팩할 값인 단일 인자를 취
합니다. 다음과 같은 간단한 데이터형의 패킹 메서드가 지원됩니다:
"pack_uint()", "pack_int()", "pack_enum()", "pack_bool()",
"pack_uhyper()" 및 "pack_hyper()".

Packer.pack_float(value)

   단정밀도 부동 소수점 숫자 *value*를 팩합니다.

Packer.pack_double(value)

   배정밀도 부동 소수점 숫자 *value*를 팩합니다.

다음 메서드는 문자열, 바이트열 및 불투명 데이터의 패킹을 지원합니다:

Packer.pack_fstring(n, s)

   고정 길이 문자열 *s*를 팩합니다. *n*는 문자열의 길이이지만 데이터
   버퍼에 팩 되지는 *않습니다*. 4바이트 정렬을 보장하는 데 필요하면 문
   자열에 null 바이트가 채워집니다.

Packer.pack_fopaque(n, data)

   "pack_fstring()"과 유사하게, 고정 길이의 불투명한 데이터 스트림을
   팩합니다.

Packer.pack_string(s)

   가변 길이 문자열 *s*를 팩합니다. 문자열의 길이를 먼저 부호 없는 정
   수로 팩하고, 문자열 데이터는 "pack_fstring()"으로 팩합니다.

Packer.pack_opaque(data)

   "pack_string()"과 유사하게, 가변 길이 불투명 데이터 문자열을 팩합니
   다.

Packer.pack_bytes(bytes)

   "pack_string()"과 유사하게, 가변 길이 바이트 스트림을 팩합니다.

다음 메서드는 배열과 리스트의 패킹을 지원합니다:

Packer.pack_list(list, pack_item)

   균질한 항목의 *list*를 팩합니다. 이 메서드는 크기가 결정되지 않은
   리스트에 유용합니다; 즉, 전체 리스트를 검사해볼 때까지 크기를 알 수
   없습니다. 리스트의 각 항목에 대해 부호 없는 정수 "1"이 먼저 팩 되고
   , 그다음에 리스트로부터의 데이터값이 옵니다. *pack_item*은 개별 항
   목을 팩하려고 호출되는 함수입니다. 리스트의 끝에서 부호 없는 정수
   "0"이 팩 됩니다.

   예를 들어, 정수 리스트를 팩하려면, 이런 코드를 사용할 수 있습니다:

      import xdrlib
      p = xdrlib.Packer()
      p.pack_list([1, 2, 3], p.pack_int)

Packer.pack_farray(n, array, pack_item)

   균질한 항목의 고정 길이 리스트(*array*)를 팩합니다. *n*은 리스트의
   길이입니다; 버퍼에 팩 되지 *않지만*, "len(array)"가 *n*과 같지 않으
   면 "ValueError" 예외가 발생합니다. 위와 같이, *pack_item*은 각 요소
   를 팩하는 데 사용되는 함수입니다.

Packer.pack_array(list, pack_item)

   균질한 항목의 가변 길이 *list*를 팩합니다. 먼저, 리스트의 길이가 부
   호 없는 정수로 팩 되고, 각 요소는 위의 "pack_farray()"와 같이 팩 됩
   니다.


Unpacker 객체
=============

"Unpacker" 클래스는 다음과 같은 메서드를 제공합니다:

Unpacker.reset(data)

   지정된 *data*로 문자열 버퍼를 재설정합니다.

Unpacker.get_position()

   데이터 버퍼의 현재의 언팩 위치를 반환합니다.

Unpacker.set_position(position)

   데이터 버퍼 언팩 위치를 *position*으로 설정합니다. "get_position()"
   과 "set_position()" 사용 시 주의해야 합니다.

Unpacker.get_buffer()

   현재의 언팩 데이터 버퍼를 문자열로 반환합니다.

Unpacker.done()

   언팩 완료를 나타냅니다. 모든 데이터가 언팩 되지 않았으면 "Error" 예
   외를 발생시킵니다.

또한, "Packer"로 팩할 수 있는 모든 데이터형은 "Unpacker"로 언팩할 수
있습니다. 언 패킹 메서드는 "unpack_type()" 형식이며 인자를 받아들이지
않습니다. 이것들은 언팩 된 객체를 반환합니다.

Unpacker.unpack_float()

   단정밀도 부동 소수점 숫자를 언팩합니다.

Unpacker.unpack_double()

   "unpack_float()"와 유사하게, 배정밀도 부동 소수점 숫자를 언팩합니다
   .

또한, 다음 메서드는 문자열, 바이트열 및 불투명 데이터를 언팩합니다:

Unpacker.unpack_fstring(n)

   고정 길이 문자열을 언팩하고 반환합니다. *n*는 예상 문자 수입니다. 4
   바이트의 정렬을 보장하기 위해서, null 바이트로 채워졌다고 가정합니
   다.

Unpacker.unpack_fopaque(n)

   "unpack_fstring()"과 유사하게, 고정 길이 불투명 데이터 스트림을 언
   팩하고 반환합니다.

Unpacker.unpack_string()

   가변 길이 문자열을 언팩하고 반환합니다. 문자열의 길이를 먼저 부호
   없는 정수로 언팩한 다음, 문자열 데이터를 "unpack_fstring()"으로 언
   팩합니다.

Unpacker.unpack_opaque()

   "unpack_string()"과 유사하게, 가변 길이 불투명 데이터 문자열을 언팩
   하고 반환합니다.

Unpacker.unpack_bytes()

   "unpack_string()"과 유사하게, 가변 길이 바이트 스트림을 언팩하고 반
   환합니다.

다음 메서드는 배열과 리스트의 언 패킹을 지원합니다:

Unpacker.unpack_list(unpack_item)

   균질한 항목의 리스트를 언팩하고 반환합니다. 리스트는 한 번에 한 요
   소씩 먼저 부호 없는 정수 플래그를 언팩해서 언팩합니다. 플래그가 "1"
   이면, 항목이 언팩되어 리스트에 추가됩니다. "0" 플래그는 리스트의 끝
   을 나타냅니다. *unpack_item*은 항목을 언팩하는 함수입니다.

Unpacker.unpack_farray(n, unpack_item)

   균질한 항목의 고정 길이 배열을 언팩하고 (리스트로) 반환합니다. *n*
   은 버퍼에서 예상되는 리스트 요소의 수입니다. 위와 같이,
   *unpack_item*은 각 요소를 언팩하는 데 사용되는 함수입니다.

Unpacker.unpack_array(unpack_item)

   균질한 항목의 가변 길이 *list*를 언팩하고 반환합니다. 먼저, 리스트
   의 길이를 부호 없는 정수로 언팩하고, 각 요소는 위의
   "unpack_farray()"처럼 언팩됩니다.


예외
====

이 모듈의 예외는 클래스 인스턴스로 코딩됩니다:

exception xdrlib.Error

   베이스 예외 클래스. "Error"에는 에러에 대한 설명을 포함하는 공용 어
   트리뷰트 "msg"가 하나 있습니다.

exception xdrlib.ConversionError

   "Error"에서 파생된 클래스. 추가 인스턴스 변수가 없습니다.

다음은 이러한 예외 중 하나를 잡는 방법의 예입니다:

   import xdrlib
   p = xdrlib.Packer()
   try:
       p.pack_double(8.01)
   except xdrlib.ConversionError as instance:
       print('packing the double failed:', instance.msg)
