2014-12-10 3 views
2

파이썬에서 이진 데이터를 보내기 위해 'binary'Thrift 데이터 형식을 사용하려고합니다. 실제 클라이언트 작업이 시작될 때 (실제로 보내기 전에) 클라이언트는 UTF 코딩에 대해 불평하는 예외를 트리거합니다. Thrift Python 라이브러리가 진정한 이진 인코딩을 지원하지 않습니까? 이것은 JSON 프로토콜을 사용하고 있으며 프로토콜이 이진 정의를 위해 자체를 보호하지 않기 때문입니다. Thrift 0.9.1은 '바이너리'필드를 '문자열'로 생성합니다 (Java 및 C++의 경우와 동일). 이 시점에서 '바이너리'의 특성입니까? Python Thrift 바이너리 형식은 인코딩이 필요합니까?

는 드리프트 정의와 클라이언트 코드는 내 :

-------------------- Thrift --------------------- 
struct Msg { 
    1: binary  aBinary, 
} 

service Service { 
    oneway void asyncMsg( 1: Msg msg), // Async 
} 

-------------------- Python --------------------- 

socket = TSocket.TSocket(host, port) 
transport = TTransport.TFramedTransport(socket) 
protocol = TJSONProtocol.TJSONProtocol(transport) 
client = Service.Client(protocol) 
transport.open() 

binaryData = "" 
for a in range(0,255): 
    binaryData += struct.pack("B",a) 

print "Sending a Binary String" 
client.asyncMsg(Service.Msg(aBinary = binaryData)) 

오류 파이썬 클라이언트 코드를 실행할 때 .... 오류 : 원격 끝으로 보내지 못했습니다 : 'UTF8'코덱은 바이트 0x80으로 디코딩 할 수 없습니다 위치 128 : 잘못된 시작 바이트

감사합니다, 로버트

+0

TBinaryProtocol을 사용하면이 문제를 해결할 수 있지만 JSON 인코딩을 사용하여 클라이언트와 서버간에 다른 엔터티를 허용하려고합니다. –

+0

JSON이 문서 전체에서 UTF-8로 정의되어 있기 때문에 의미가 있습니다. '2 진'IDL 유형은 JSON 프로토콜에서 사용할 수 없습니다. –

답변

1

Thrift JSON 전송을 사용하면 binary 데이터는 패딩을 포함하거나 포함하지 않고 base64로 인코딩 될 것으로 예상됩니다. base64는 8 바이트 문자 스트링에 쉽게 맞기 때문에, 당신이 직면하고있는 문제는 Python JSON 전송에 문제가있을 가능성이 매우 높다는 것을 나타냅니다.

불행히도 binary 데이터 유형은 여전히 ​​일부 테스트 적용 범위가 부족합니다. This is about to change.

0

해결 방법은 대신 JSON의 TBinaryProtocol을 사용하는 것입니다. JSON 인코딩을 사용하려면 모든 컨텐츠가 UTF-8과 호환되어야합니다.

+0

동의하지 않습니다. 바이너리는 JSON에서도 작동해야합니다. "* 문자열은이 시점에서 '이진'의 특성입니까? *"- 바이너리가 추가되었습니다. 사실입니다. 코드베이스에서 그런 것들을 찾을 수 있습니다. 그럼에도 불구하고 작동해야합니다. 그렇지 않은 경우 ... – JensG

+0

"해결 방법"에 "솔루션"을 편집했습니다. 실제로 그 것이기 때문입니다. – JensG

+0

JSON이 정의에 따라 UTF-8로 인코딩 될 것으로 예상되는 경우 이진 데이터를 'String'유형의 할당에 사용할 수있는 형식으로 인코딩해야합니까? JSON 인코딩이 할당을 시도한 것으로 보이며 위 테스트가 실패합니다. 테스트는 상위 바이트 '1'이있는 첫 번째 바이트에서 정확하게 실패합니다. –

관련 문제