문제

파일 업로드 서비스가 포함 된 것을 만들어 내고 Zlib의 compress () 함수로 압축 된 데이터를 저장해야합니다. 인터넷을 통해 이미 압축 된 인터넷을 통해 보내지 만 원격 서버에서 압축되지 않은 파일 크기를 알아야합니다. 효율성을 위해 서버의 데이터를 먼저 돌리지 않고이 정보를 파악할 수있는 방법이 있습니까? 그것이 내가 지금하고있는 방식이지만 바로 가기가 있다면 가져 가고 싶습니다.

그건 그렇고, 왜 그것을 압축 압력을받지 않는가? 그것은 나에게 꽤 끔찍하게 들린다. 나는 항상 그것이 압축 압축 될 것이라고 생각했다 ...

도움이 되었습니까?

해결책

Zlib 형식에는 원래 입력 크기에 대한 필드가 없으므로 데이터의 감압을 시뮬레이션하지 않고도 그렇게 할 수 있을지 의심됩니다. 그만큼 GZIP 형식 "입력 크기"가 있습니다 (ISIZE) 필드, 사용할 수 있지만 압축 형식을 변경하거나 클라이언트가 파일 크기를 전송하지 않으려는 것입니다.

그러나 다른 형식을 사용하더라도 클라이언트를 신뢰하지 않으면 압축되지 않은 데이터가 클라이언트가 말하는 크기인지 확인하기 위해 더 비싼 수표를 실행해야합니다. 이 경우, 당신이 할 수있는 것은 압축-/dev/null Zlib가 압축되지 않은 크기를 알고 싶기 때문에 Zlib이 출력 데이터를 어디에나 쓰지 않도록 처리하십시오.

다른 팁

나는 그것을 의심한다. 나는 이것이 기본 Zlib 라이브러리가 메모리에서 제공하는 것이라고 생각하지 않습니다 (사용한 지 7 년 또는 8 년이 지났지 만 최신 문서는이 기능이 추가되었음을 나타내지 않는 것 같습니다).

압축되지 않은 크기가 포함 된 다른 파일을 전송하는 것입니다 (예 : 양도 file.zip 그리고 file.zip.size) 그러나 그것은 특히 크기가 잘못되면 위험에 처해있는 것 같습니다.

또 다른 대안은, 서버가 압축되지 않은 서버가 시간이 멀지 만 즉시 수행 할 필요가 없다면, 우선 순위가 낮은 배경 작업 (예 : nice Linux에서). 그러나 크기 체커가 뒤에서 실행되기 시작하면 (너무 많은 업로드가 들어 오면) 단점이 다시 발생할 수 있습니다.

그리고 나는 "폭발성 감압"의 관점에서 감압을 생각하는 경향이 있습니다.

RAW 'Compress'형식을 사용하여 업로드하는 경우 업로드중인 데이터의 크기에 대한 정보가 없습니다. 이와 관련하여 Pax는 정확합니다.
압축 버퍼 시작시 4 바이트 헤더로 저장할 수 있습니다. 파일 크기가 4GB를 초과하지 않는다고 가정합니다.
예를 들어 일부 C 코드 :

 uint8_t *compressBuffer = calloc(bufsize + sizeof (uLongf), 0);
 uLongf compressedSize = bufsize;
 *((uLongf *)compressBuffer) = filesize;
 compress(compressBuffer + sizeof (uLongf), &compressedSize, sourceBuffer, bufsize);

그런 다음 크기 CompressedSize + Sizeof (ULONGF)의 전체 압축 버퍼를 보냅니다. 서버 측에서 수신하면 다음 코드를 사용하여 데이터를 다시 얻을 수 있습니다.

 // data is in compressBuffer, assume you already know compressed size.
 uLongf originalSize = *((uLongf *)compressBuffer);
 uint8_t *realCompressBuffer = compressBuffer + sizeof (uLongf);

클라이언트가 올바른 크기를 보내는 것을 신뢰하지 않으면 서버 크기에 대한 일종의 비 압축 데이터 검사를 수행해야합니다. 압축 압력을 /dev /null을 사용한다는 제안은 합리적인 것입니다.
.zip 파일을 업로드하는 경우 파일이 압축되지 않은 경우 파일의 크기를 알려주는 디렉토리가 포함되어 있습니다. 이 정보는 파일 형식에 내장되어 있지만 악의적 인 클라이언트가 적용됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top