2013-05-31 3 views
2

이 생성 된 C 라이브러리를 사용하고 있습니다. swig입니다. 임의의 파이썬 문자열을 C 라이브러리에 전달하려고합니다. 는 C-도서관이 데이터를 처리하는 char를 사용SWIG : 이진 데이터 전달에 실패했습니다.

\xff\x0A\82

:이 문자열은 예컨대 인쇄 할 수없는 문자가 포함되어 있습니다. 변환 나는 꿀꺽 꿀꺽 타입 맵을 다음 사용

%typemap(in) (char *data, int size) 
{ 
     if(!PyUnicode_Check($input)) 
     { 
       PyErr_SetString(PyExc_ValueError, "String value required"); 
       return NULL; 
     } 

     $1 = PyBytes_AsString(PyUnicode_AsUTF8String($input)); 
     $2 = PyUnicode_GetSize($input); 
} 

이 부분적으로 작동합니다. 0x000x7F 사이의 값만 작동합니다. 0xFF 값이 0xC3 인 잘못된 값으로 변환됩니다.

0x00 ~ 0xFF에 대한 제안 사항이 있습니까?

답변

2

유니 코드 문자열 '\xff'은 코딩 한대로 UTF-8 바이트 시퀀스 b'\xc3\xbf'으로 변환됩니다.

당신이 바이트의 데이터를 전송 바이트 문자열 (b'\xff\x0a\x82')를 사용하고 char*와 크기로 변환하는 PyBytes 방법을 사용하려면 :

%typemap(in) (char* data,int size) (Py_ssize_t len) %{ 
    if(PyBytes_AsStringAndSize($input,&$1,&len) == -1) 
     return NULL; 
    $2 = (int)len; 
%} 

이는 32 비트 및 64에서 작동해야 -bit Windows 및 null 바이트는 크기가 명시 적으로 추출되고 64 비트 Py_ssize_t의 가능성을 처리하기 때문에 데이터에 포함될 수 있습니다.

관련 문제