팩비트

PackBits

PackBits는 데이터의 런 길이 인코딩을 위한 빠르고 단순한 무손실 압축 체계다.

애플매킨토시 컴퓨터에 MacPaint가 출시된 PackBits 포맷을 선보였다.이 압축 방식은 TIFF 파일에서 사용할 수 있다.TGA 파일도 이 RLE 압축 방식을 사용하지만 데이터 스트림을 바이트 대신 픽셀로 처리한다.

PackBits 데이터 스트림은 1바이트 헤더가 있는 패킷과 그 뒤에 있는 데이터로 구성된다.헤더는 서명된 바이트로, 데이터는 서명되거나 서명되지 않거나 포장될 수 있다(MacPaint 픽셀 등).

다음 표에서 n은 서명된 정수로 헤더 바이트의 값이다.

헤더 바이트 헤더 바이트 이후의 데이터
0 대 127 (1 + n) 리터럴 바이트 데이터
-1 ~ -118 1바이트의 데이터, 압축 해제된 출력에서 반복(1 - n) 횟수
−128 작동 없음(다음 바이트를 머리글 바이트로 건너뛰고 처리)

0을 양수 또는 음수로 해석하면 출력에 차이가 없다는 점에 유의하십시오.비 런에 인접한 2바이트의 런은 일반적으로 리터럴 데이터로 기록된다.데이터 스트림의 끝을 결정하는 데 PackBits 데이터를 기반으로 하는 방법은 없다. 즉, PackBits 데이터 스트림을 읽기 전에 압축되거나 압축되지 않은 데이터의 크기를 이미 알고 있어야 한다.

Apple Computer(외부 링크 참조)는 다음과 같은 간단한 데이터 패키지 예를 제공한다.FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA

Microsoft VBA에 기록된 다음 코드는 데이터의 압축을 해제한다.

후보선수 언팩비트데모()    어둡다 파일 로서 변종    어둡다 MyOutput 로서     어둡다 카운트 로서     어둡다 i 로서 , j 로서        파일 = "FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA"    파일 = 분할(파일, " ")        을 위해 i = LBound(파일) 에게 UBund(파일)       카운트 = 적용.워크시트기능.헥스2데크(파일(i))       선택 케이스 카운트       케이스 이다 >= 128          카운트 = 256 - 카운트 '두 개의 보완물'          을 위해 j = 0 에게 카운트 '제로 베이스'             MyOutput = MyOutput & 파일(i + 1) & " "          다음 j          i = i + 1 '포인터 조정'       케이스 기타          을 위해 j = 0 에게 카운트 '제로 베이스'             MyOutput = MyOutput & 파일(i + j + 1) & " "          다음 j          i = i + j '포인터 조정'        선택    다음 i     디버그.인쇄하다 MyOutput    'AA AA AA 80 00 2A AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA AA AA AA.  후보선수 

JavaScript에서 동일한 구현:

/** * 읽기 가능한 입력 및 출력을 생성하는 도우미 기능 * * 또한 대화형 PackBits 디코더에 대한 내용은 다음 항목을 참조하십시오. * https://jsfiddle.net/y13xkh65/3/ */  기능을 하다 str2hex (발을 동동 구르다) {     돌아오다 발을 동동 구르다.갈라지다('').지도를 그리다(기능을 하다 (마를 뜨다) {         시합을 하다 가치를 매기다 = 마를 뜨다.charCodeAT(0);          돌아오다 ((가치를 매기다 < 16 ? '0' : '') + 가치를 매기다.토스트링(16)).토퍼케이스();     }).합류하다(' '); }  기능을 하다 육십이 줄 (육각의) {     돌아오다 육각의.갈라지다(' ').지도를 그리다(기능을 하다 (끈을 매다) {         돌아오다 .CharCode에서.(파스인트(끈을 매다, 16));     }).합류하다(''); }  /** * PackBits 언팩 기능 * * @param {String} 데이터 * @return {String} */ 기능을 하다 언팩비트 (자료) {     시합을 하다 생산량 = '',     i = 0;      하는 동안에 (i < 자료.길이) {         시합을 하다 육각의 = 자료.charCodeAT(i);          만일 (육각의 == 128) {             // 아무 것도 하지 마, nop         }         다른 만일 (육각의 > 128) {             // 이것은 반복 바이트             육각의 = 256 - 육각의;              을 위해 (시합을 하다 j = 0; j <= 육각의; ++j) {                 생산량 += 자료.챠랏(i + 1);             }              ++i;         }         다른 {             // 이 바이트들은 리터럴 바이트 입니다.             을 위해 (시합을 하다 j = 0; j <= 육각의; ++j) {                 생산량 += 자료.챠랏(i + j + 1);             }              i += j;         }          ++i;     }      돌아오다 생산량; }  시합을 하다 독창적인 = 'FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA',     자료 = 언팩비트(육십이 줄(독창적인));  // 출력물: AA AA AA 80 00 2A AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA AA AA AA AA 위로하다.통나무를 하다(str2hex(자료)); 

외부 링크