2011-03-14 4 views
1

python zlib의 출력 결과를 C++ 문자열에 쓰려고합니다. 질문은 Python zlib output, how to recover out of mysql utf-8 table?과 매우 비슷하지만, 차이점은 압축 된 데이터를 문자열로 저장해야하는 C++ 헤더 파일을 python 스크립트가 생성한다는 것입니다. 그러나 특수 문자 및 원시 바이트로 인해 C++에서이를 문자열로 읽을 수 없습니다. 내가 파일에 쓸 수 없다는 이유와 C++ 프로그램으로 다시 쓸 수없는 이유는 이것이 드라이버 구성 요소 일 수 있고 따라서 파일을 읽을 수 없기 때문입니다. 여기 제가 시도한 것의 작은 예가 있습니다.python zlib을 C++ 문자열로 출력


compressed_string = zlib.compress("This is a huge string. Around 263KB") 
fptr = open('my_header.h', 'w') 

content = "#ifndef __HEADER_DEFS__\n\ 
#define __HEADER_DEFS__\n\ 
\n\ 
#include \n\ 
\n\ 
std::string binary_compressed = \"%s\" \n\ 
\n\ 
#endif" % compressed_string 

fptr.write(content) 
fptr.close() 

그러나, 나는 압축하고있는 문자열은 큰 데이터는 예와는 달리 여기 준 따라서 나는 실제의 예에서 무엇입니까 문자의 종류에 스크린 샷을 추가하고있다.

http://tinypic.com/r/1078lxw/7을 (를) 스크린 샷으로 살펴보십시오. 감사합니다.

답변

3

8 진법을 사용하는 문자열에 escape the non-printable characters이 필요합니다. 예를 들어

,
import string 
.... 
safe_string = "" 
for ch in compressed_string: 
    if ch in string.printable and ch != '\\': 
     safe_string += ch 
    else: 
     safe_string += "\%o" % ord(ch) 
content = ".....\"%s\" ...." % safe_string 

(즉, 문제를 일으킬 것입니다 법률 16 진수, 수 있습니다 이스케이프 문자를 따라 가변 길이와 인쇄 가능한 문자가 될 수있는 진수 표기법을 피하기 위해 adviced됩니다)
+0

'\'는 여전히 인쇄 가능하지만 C/C++ 컴파일러가 구문 분석 할 때 이스케이프 처리를 유도합니다. –

+0

@Mark B thx fixed – Will

+0

고마워요. 작동하지 않습니다. – ssarangi

2

C++ 프로그램에 바이너리 데이터를 포함시키려는 경우 Unix xxd -i 명령이 도움이됩니까?

그러면 입력 이진 파일의 배열 표현 char을 포함하는 C 헤더 파일이 생성됩니다.

+0

xxd가 없어도 파이썬에서 char 배열을 생성하는 것은 충분히 간단합니다. –