2014-03-03 5 views
1

잘 모르겠다면 이것이 잘못된 것입니다. 왜냐하면 이것은 실제로 전문 분야가 아니기 때문에 저는 저에게 완전한 디코딩 된 openframeworks 버퍼를 제공해야한다는 인상을 받고있었습니다. 문자열, 내가 여러 가지 방법 모두 같은 너무 짧은 문자열의 결과로) 시도 :완전한 문자열을 반환하지 않는 Poco :: Base64Decoder 스트림

I2J1bmRsZQAAAAAAAAAAAQAAABwvT1NDL1NwYWNlSW50ZW5zaXR5ACxmAAA6nUlSAAAAFC9PU0MvU3BlZWQAACxmAAA90/fPAAAAGC9PU0MvU21vb3RobmVzcwAsZgAAP2Wu5gAAABQvT1NDL1JlYWNoAAAsZgAAPnxQSAAAABgvT1NDL0RlbnNpdHkAAAAALGYAAAAAAAAAAAAYL09TQy9Db2hlcmVuY2UAACxmAAA+tYEGAAAAIC9PU0MvVHJhdmVsSW50ZW5zaXR5AAAAACxmAAA8eQlsAAAAFC9PU0MvUmh5dGhtACxmAAA+6LQ5AAAAGC9PU0MvSGFybW9ueQAAAAAsZgAAPui0OQAAABQvT1NDL0VuZXJneQAsZgAAPYznBA== 

이 라인은 간단한에 해결되지 않습니다

string str; // string is a line from a file handle and shows to be ok in the debugger 
istringstream istr(str); 
Poco::Base64Decoder b64in(istr); 
ofBuffer buffer; 
b64in >> buffer; 

을 지금은 디코딩하고 예 base64로 문자열이 라인 ascii 텍스트가 아닌 raw osc 패킷이 base64에서 일부 v로 덤프 됨 vvv 패치에 대한 액세스 권한이 없습니다 ... 인코딩 문제 일 수도 있습니다.

출력에 상관없이 위와 같은 streamcopier 또는 연산자를 사용하더라도 "#bundle"만 출력됩니다. 이것이 어떻게 든 "# 묶음"뒤에 나오는/문자 또는 다른 비표준 물건과 관련 될 수 있습니까? 나는 Base64Decoder가 공백이나 디코딩 된 데이터에서 찾은 것이 무엇이든 상관하지 않는다는 인상을 받았다.

+1

'std :: string'은 (는) 바이트 버퍼가 아닙니다! 실제로는 NULL 문자 및 제어 문자와 같은 것에 관심이 있습니다. – Paranaix

+1

@Paranaix - std :: string은 제어 문자를 저장할 수 있습니다. 문제는 프로그래머가 명시 적으로 string :: append()를 사용하거나 char * 및 정수를 취하는 두 개의 인수 생성자를 사용하여 문자열을 생성하는 경우에만 수행 할 수 있다는 것입니다. – PaulMcKenzie

+0

빠른 댓글을 주셔서 감사합니다. 하지만 여기에 바이트 버퍼를 사용하므로 입력 행만 문자열입니다. 나는 base64decoder의 출력이 공백을 신경 쓰지 않아야하고 실제로 무엇을 나타내더라도 모든 문자를 반환해야한다고 생각했습니다. 어떤 다른 방법으로 base64decoder의 내용을 검색 할 수 있습니까? poco의 streamcopier가 동일한 결과를 반환했습니다. – DasAntonym

답변

4

그래서 연산자를 사용하여 오히려 스트림에 base64decoder의 출력을 복사 한 후 그에서 문자열을 못하고 결국 :

istringstream istr(str); 
ostringstream ostr; 
Poco::Base64Decoder b64in(istr); 
copy(std::istreambuf_iterator<char>(b64in), 
    std::istreambuf_iterator<char>(), 
    std::ostreambuf_iterator<char>(ostr)); 
cout << ostr.str(); // returns full decoded output 
1

이 실제로 마시고 :: Base64Decoder과는 아무 상관이 없습니다. std :: string에 대한 스트림 추출 연산자는 입력 스트림에서 발견되는 첫 번째 공백 문자 (Base64Decoder의 경우 디코딩 된 데이터)에서 중단됩니다.