내 프로그램이 PDF 파일을 처리하고 일부 스트림을 읽습니다. FlateEncoded 스트림도 있습니다. zlib의 "inflate()"메소드를 사용하여 압축을 해제합니다.zLib inflate가 일부 경우 빈 결과를 나타냅니다.
이것은 일반적으로 다음 코드를 정말 잘 작동합니다
static string FlateDecode(string s){
int factor = 50;
z_stream stream;
while(true){
char * out = new char[s.length()*factor];
stream.zalloc = Z_NULL;
stream.zfree = Z_NULL;
stream.opaque = Z_NULL;
stream.avail_in = s.length();
stream.next_in = (Bytef*)s.c_str();
stream.avail_out = s.length()*factor;
stream.next_out = (Bytef*)out;
inflateInit(&stream);
inflate(&stream, Z_FINISH);
inflateEnd(&stream);
if(stream.total_out >= factor*s.length()){
delete[] out;
factor *= 2;
continue;
}
string result;
for(unsigned long i = 0; i < stream.total_out; i++){
result += out[i];
}
delete[] out;
return result;
}
}
을하지만, 팽창하는 일부 스트림 빈 결과가 있습니다. 자주는 아니지만 일어난다. 누군가 왜 그런 생각을 가지고 있습니까?
모든 PDF 리더가 PDF 파일을 올바르게 읽으므로 스트림을 확인해야합니다.
도움 주셔서 감사합니다.
자신에 의해 그것을 확인할 수 있도록 나는 PDF 및 스트림을 업로드 한
UPDATE.
PDF -> I 스트림이 압축 해제 될 수있는 스트림을 압축 해제 될 할수 없어 스트림 비해 43,296 바이트
UPDATE 2
에서 시작한다. 흥미로운 점을 발견했습니다. 작업 스트림은 모두 2 바이트 H %로 시작합니다. 문제가있는 스트림은 ö>로 시작합니다. 지금이 누군가는 무엇을 의미합니까?
도움 주셔서 감사합니다.
"inflate does not empty result"란 무엇을 의미합니까? (나는 그것이 0을 반환 팽창했다 것,하지만 당신은 ** ** 반드시해야 ** inflate 통화의 반환 값을 확인하지 않습니다) – nos
그것은 내가 어떤 데이터를 부풀려 때, 스트림의 가치를 의미합니다 .total_out은 0입니다. 즉, 출력이 없음을 의미합니다. -> 반환 된 문자열의 길이도 0입니다. –
입력이 실제로 '팽창 식'인지 확실합니까? 파일로 출력 해보고 명령 행을 통해 입력이 실제로 유효하다는 것을 확인 했습니까? 또한,'inflate()'의 반환 값은 무엇입니까? – JaredC