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)