# `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)