KR20020008101A - 데이터의 비트 인덱스 압축방법 - Google Patents

데이터의 비트 인덱스 압축방법 Download PDF

Info

Publication number
KR20020008101A
KR20020008101A KR1020010078392A KR20010078392A KR20020008101A KR 20020008101 A KR20020008101 A KR 20020008101A KR 1020010078392 A KR1020010078392 A KR 1020010078392A KR 20010078392 A KR20010078392 A KR 20010078392A KR 20020008101 A KR20020008101 A KR 20020008101A
Authority
KR
South Korea
Prior art keywords
data
bit
bits
index
stop
Prior art date
Application number
KR1020010078392A
Other languages
English (en)
Inventor
이상수
Original Assignee
주식회사 애니콤소프트웨어
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 주식회사 애니콤소프트웨어 filed Critical 주식회사 애니콤소프트웨어
Priority to KR1020010078392A priority Critical patent/KR20020008101A/ko
Publication of KR20020008101A publication Critical patent/KR20020008101A/ko

Links

Classifications

    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M7/00Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
    • H03M7/30Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
    • H03M7/60General implementation details not specific to a particular type of compression
    • H03M7/6017Methods or arrangements to increase the throughput
    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M7/00Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
    • H03M7/30Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
    • H03M7/3084Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction using adaptive string matching, e.g. the Lempel-Ziv method
    • H03M7/3091Data deduplication
    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M7/00Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
    • H03M7/30Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
    • H03M7/60General implementation details not specific to a particular type of compression
    • H03M7/6011Encoder aspects

Abstract

본 발명은 데이터의 비트 인덱스 압축방법에 관한 것으로서, 하나의 컴퓨터 파일 안에서 상대적으로 많이 사용되는 또는 연속적으로 나열된 바이트 데이터를 압축하여 컴퓨터 파일의 용량을 작게 할 수 있는 데이터의 비트 인덱스 압축방법에 관한 것이다.

Description

데이터의 비트 인덱스 압축방법{Constriction method of data with bits index}
본 발명은 데이터의 압축방법에 관한 것이다. 더욱 상세하게는, 하나의 컴퓨터 파일 안에서 상대적으로 많이 사용되는 또는 연속적으로 나열된 바이트 데이터를 압축하여 컴퓨터 파일의 용량을 작게 할 수 있는 데이터의 비트 인덱스 압축방법에 관한 것이다.
최근, 컴퓨터 하드웨어의 발달과 컴퓨터 프로그램의 대용량화에 따라 컴퓨터 파일의 크기가 매우 클 뿐만 아니라 컴퓨터 프로그램에는 이미지, 동영상, 사운드 등의 각종 데이터가 있다. 그런데, 이러한 파일들은 그 용량이 매우 크기 때문에 인터넷을 통하여 전송을 하거나 다운을 받는데에 매우 많은 시간을 요한다.
특히, 휴대폰은 흑백의 액정화면에서 점차적으로 컬러화가 되어 가고 있으며, 보다 많은 기능을 가진 휴대폰이 개발되고 있는 실정이다. 이에 따라 화려한 그림이라든지 사운드 등의 많은 용량의 데이터를 필요로 하고 있다. 또한 휴대폰 어플리케이션에서 사용이 가능해야 한다. 따라서, 데이터 파일의 크기와 이에 따른 전송속도가 문제가 된다.
모든 파일들은 기본 입출력 단위인 바이트 형태로 저장되어 있다. 바이트가가질 수 있는 값은 0부터 255까지 모두 256가지이다. 이렇게 저장된 바이트 데이터 중에서 많이 사용되는 바이트 데이터들이 존재하게 되는 반면 매우 적게 사용되거나 혹은 전혀 사용되지 않는 바이트 데이터들이 존재하게 된다. 따라서, 이러한 바이트 데이터를 어떻게 정리하여 데이터 파일을 압축할 것인가가 문제로 된다.
종래에는 데이터 압축용 알고리즘의 하나로서 실행 길이 인코딩 알고리즘이 있다. 실행 길이 인코딩 알고리즘은 고압축율을 얻을 수 있기 때문에 데이터가 주로 영상(Visual image)등의 동일값 비트들의 시퀀스로 구성된 때에 데이터 압축을 위해 빈번하게 선택되는 방법이다.
이러한 데이터 압축 알고리즘에서는 알파벳 심볼들이 종종 정의되며, 이러한 심볼은 하나 이상의 비트들로 구성될 수 있다. 데이터 압축은 데이터를 심볼 및 그 반복 요소, 즉 연속 발생의 쌍으로서 표현함으로써 달성된다. 알파벳이 0 및 1과 같은 2 비트값으로만 구성된 경우, 일반적으로 실행길이로도 불리는 연속적인 반복 요소들이 교차의 비트값들의 시퀀스의 길이를 지정할 수 있기 때문에 실행길이 인코딩 알고리즘의 효율을 한정하는 문제는 반복 요소들이 소정 비트수를 차지하는 것이고, 압축을 위해 특별히 실제의 데이터를 인지하지 않고서, 이들 반복 요소들을 표현하기 위해 최적의 비트수를 결정하는 것은 어렵거나 불가능하다.
더욱더, 문제를 더욱 악화시키는 것은 인코딩 프로세스가 개시되기 전에 전체 데이터 세트 또는 비트 스트림의 반복 요소의 분포가 공지되어 있는 경우에도, 반복 요소를 인코딩하기 위한 최상의 비트 수의 선택이 어느 하나의 데이터 세트 또는 비트 스트림 전체에서 일정할 필요가 없다는 것이다. 이 경우, 소정의 비트수의 선택으로부터 차선의 데이터 압축비가 발생되어 반복 요소를 인코딩한다. 매우 많은 비트들을 이용하여 반복 요소를 표현하는 것은 낭비이며, 데이터 압축의 목적에 반하는 문제점이 있었다.
또한, 충분한 비트를 이용하지 않고서 반복 요소들을 표현하는 것은 알고리즘이 반대 비트값의 실행길이 시퀀스, 또는 동일한 목적을 위한 다른 방법을 유도하고, 동일한 방식으로 표현되는 매우 긴 나머지 시퀀스를 인코딩하게 하게 되는 문제점이 있었다.
본 발명에서 이루고자 하는 기술적 과제는 하나의 파일 내에서 상대적으로 많이 사용되는 또는 연속적으로 나열된 바이트 데이터를 압축하기 위한 방법을 제공하여 컴퓨터 데이터 파일의 압축뿐만 아니라, 모든 휴대폰 어플리케이션에서 사용이 가능하고, 모든 포맷에 대한 지원을 하며, 이미지 데이터 파일에 적용시킬 경우 이미지 데이터의 변형이 전혀 발생하지 않는 데이터의 비트 인덱스 압축방식을 제공하는 것이다.
도 1은 본 발명의 데이터의 비트 인덱스 압축방법의 파일을 열고 데이터를 분석한 후 압축하는 과정을 나타내는 흐름도이다.
도 2는 본 발명의 데이터의 비트 인덱스 압축방법의 첫 번째와 두 번째 정지 비트의 조합인 정지 비트와 그 나머지 부분을 위한 말미 비트를 설정하는 과정을 나타내는 흐름도이다.
도 3은 본 발명의 데이터의 비트 인덱스 압축방법의 비트 패턴을 정하는 실시예를 나타내는 예시도이다.
따라서, 본 발명의 목적은, 하나의 파일 내에서 바이트 데이터의 사용된 개수를 파악하는 단계; 상기 파악된 바이트 데이터들 중에서 많이 사용된 값을 기준으로 내림차순으로 정렬하는 단계; 상기 정렬된 값을 기준으로 인덱스를 구성하는 단계; 비트 압축을 위해 정지 비트와 말미 비트를 구하는 단계; 일정 비율을 정하여 인덱스 표현을 위한 비트 패턴을 구성하는 단계; 상기 구성된 비트 패턴을 이용하여 인덱스 값과 사용된 데이터 개수의 합의 형태로 순차적으로 압축하는 단계로 구성된 데이터의 비트 인덱스 압축방법을 제공하는 것이다.
또한, 상기 비트 압축을 위해 정지 비트와 말미 비트를 구하는 단계는 첫 번째 정지 비트를 위한 비율 1(ratio 1)을 설정하는 단계; 인덱스 배열의 1번 데이터부터 8번 데이터까지 더하면서 비율 1과 비교하는 단계; 첫 번째 정지 비트를 생성하는 단계; 두 번째 정지 비트를 위한 비율 2를 설정하는 단계; 인덱스 배열 커런트 번째의 데이터부터 커런트와 32의 합까지의 데이터까지 더하면서 비율 2와 비교하는 단계; 상기 비교된 결과를 출력하는 단계; 상기 출력된 결과의 값을 표현하기 위해 필요한 비트수를 구하는 단계; 상기 구해진 비트수를 이용하여 말미 정지 비트를 구하는 단계; 전체 인덱스 배열의 크기에서 정지 비트의 필요한 개수를 뺀 나머지 결과를 구하는 단계; 상기 구해진 결과를 표현하기 위한 비트수를 구하는 단계; 상기 구해진 비트수를 이용하여 말미 비트를 구하는 단계로 구성된다.
파일을 압축하는 과정에서는 압축하고자 하는 숫자값을 임의의 비트로 표현할 수 있는가 하는 것이 중요하다. 만약 압축하고자 하는 수를 그대로 바이트 형태로 표현을 한다면 압축이 불가능하고, 때로는 역효과를 보게 된다. 따라서, 수를 표현하는데 있어서 최소한의 비트로 표현하고자 하는 것이 본 발명의 핵심이다.
따라서, 이를 위하여 비트로 나열된 데이터의 중간에 정지 비트(Stop Bit)를 두어서 원하는 수를 비트로 표현하는데 있어서, 정지 비트를 참조하여 상기 정지 비트까지인지 아니면 더 확장이 되는지를 판단하게 되는 것이다. 즉, 정지 비트가 0이면 원하는 값이 그 이전 비트까지임을 의미하는 것이고, 정지 비트가 1이면 그 다음의 정지 비트가 0이 될 때까지 확장이 되는 것이다.
예컨대, #를 값을 의미하는 비트이고 s를 정지 비트라고 가정하고, ###s###와 같은 형태로 비트 패턴을 정했다면 첫 번째 정지 비트까지 나올 수 있는 값은 0000(십진수로는 0)부터 1110(십진수로는 7)까지 모두 8가지가 된다. 이 때, 정지 비트는 계산에서 빠지고 그 앞의 비트들만을 값으로 취한다. 만약 첫 번째 정지 비트가 1이면 값이 초과하게 되어 나오는 비트 값들을 합해서 원하는 수를 구하게 된다. 두 번째 정지 비트가 0이면 나올 수 있는 값은 00010000(십진수로는 8)부터 11111110(십진수로는 71)까지로서 모두 64가지가 되고 첫 번째 정지 비트에서 해결되지 않고 초과된 값이므로 표현 가능한 값은 모두 72(0부터 71)가지이다.
이와 같은 원리로 하나의 값을 표현하는데 최소의 비트만을 사용하므로 압축의 효과를 기대할 수 있게되는 것이다. 물론 상기의 방법은 바이트 데이터의 최대값인 256을 표현하는데 있어 필요한 비트인 8 비트를 초과하게 되지만 하나의 파일에서 사용된 바이트 데이터를 종류별로 개수를 파악한 후 가장 많이 사용된 데이터 순으로 정렬하여 그 인덱스를 만들어 사용할 수 있다.
상기한 바와 같이, 모든 파일의 바이트 데이터들이 나올 수 있는 종류는 최대 256가지(0부터 255)이다. 각각의 종류별로 사용될 개수를 파악한 후 가장 많이 사용된 데이터 순으로 정렬하여 그 순서에 맞게 배열하는 인덱스 배열을 구성한다. 따라서, 바이트 데이터를 기준으로 나올 수 있는 인덱스 배열의 최대값은 256이며, 그 안에서 모든 값이 표현되어 질 수 있다. 본 발명의 핵심은 이렇게 구성된 인덱스 배열에서 몇 번째에 원하는 값이 있는지를 결정하는 인덱스를 적은 수의 비트만을 사용하여 구성하는 것이다. 이때 사용되는 압축의 종류는 2가지인데, 첫 번째는 상기의 인덱스를 압축하는 것이고, 두 번째는 연속적으로 이어지는 값의 개수를 압축하는 것이다. 두 가지 모두 압축하는 원리는 상기의 압축의 원리를 사용하지만 정지 비트의 위치와 관련해서는 약간 다른 방법이 사용된다. 전자의 인덱스를 위한 값의 압축은 나올 수 있는 최대값이 256으로 이미 고정되어 있지만 사용된 빈도수는 파일마다 각각 다르므로 정지 비트의 위치는 상황에 따라 가변적이며, 사용되는비트의 최대값은 10비트로 고정되어 지는 것이 특징이다. 반면에 후자의 연속적으로 이어지는 값의 개수는 그 최대값이 고정되어 있지 않으므로 정지 비트의 위치는 고정적이며 사용되는 비트의 최대값은 고정되어 있지 않은 것이 특징이다. 우선 가변적인 정지 비트의 위치를 정하는 방법은 ###s##s###로 기본적인 비트 패턴을 정하고, 첫 번째 정지 비트의 위치는 파일에서 사용된 데이터의 크기(바이트)에서 적정 비율을 정하여 기본 비트 패턴처럼 4번째 비트를 벗어나지 않는 범위인 8개 데이터의 사용 횟수를 더하여 원하는 비율에 미치지 못한 경우 ###s 형태를 취하고 만약 원하는 비율을 초과한 경우 그 비율에 해당하는 개수를 파악하여 비트 패턴을 정한다. 따라서 s, #s, ##s 등의 비트 패턴이 나올 수 있다. 최상위 인덱스의 데이터 1개의 사용 횟수가 50% 이상이면 s(1비트)가 될 것이고, 2 개의 사용 횟수를 더해야 50%이상이라면 #s(2비트)형태를, 4개 이하의 사용 횟수를 더해야 한다면 ##s (3비트)의 형태를, 8개 이하 또는 그 이상의 사용 횟수를 더해야 한다면 ###s(4비트)형태의 비트 패턴이 결정될 것이나, 두 번째 정지 비트의 위치를 정하는 방법도 첫 번째 정지 비트를 정하는 방법을 사용하여 비트 패턴을 결정한다. 세 번째는 정지 비트가 없으며 대신 몇 개의 비트가 사용되는지 많을 인코딩 정보에 기술하여 준다. 이렇게 해서 인덱스 값의 압축에 사용되는 가변 정지 비트를 이용한 비트 패턴이 결정된다. 다음으로 고정 정지 비트를 사용하는 데이터의 나열된 개수의 압축에 대한 것이다. 이 방식은 s#s#s##s###s#### 이렇게 16비트 형태로 고정되어 있으며 최대 표현 가능한 수는 2199이다. 가장 높은 효율의 압축이 나올 수 있는 상황은 인덱스 배열의 최상위 데이터 1개의 사용 횟수가 전체 파일 크기의 50%이상이고, 그 데이터가 2199바이트 연속적으로 나열되는 상황으로 2199바이트 데이터를 표현하는데 17비트(2바이트는 1비트)를 사용하게 되며 최악의 경우 인덱스 배열의 최하위 데이터가 1바이트만으로 나열된 상황으로 1바이트를 표현하는데 10비트(1바이트+2비트)를 사용하게 된다. 이때, 두 번째 정지 비트까지 사용하여 표현이 불가능한 인덱스 값이면 그 나열된 개수를 표현하지 않고 무조건 1개만 나열된 것으로 인식한다. 그래서 압축의 효율을 높이기 위해 사용 빈도가 높은 데이터 순으로 정렬하는 것이 필수적이다.
이하, 첨부된 도면을 참조하여 상세히 설명한다.
도 1은 본 발명의 데이터의 비트 인덱스 압축방법의 파일을 열고 데이터를 분석한 후 압축하는 과정을 나타내는 흐름도이다. 본 도면에 나타난 바와 같이, 압축 알고리즘이 시작되면 파일을 열어 데이터를 버퍼(buffer)로 불러들여 임시로 주기억 장치에 저장하고 또한 기록하기 위한 파일도 열어둔다.
그후, 버퍼에 저장되어 있는 데이터(0부터 255사이의 값)를 종류별로 합을 구한 후 많이 사용된 데이터를 기준으로 내림 차순으로 정렬을 하고 정렬된 데이터를 인덱스 배열을 구성한다. 따라서, 바이트 데이터를 기준으로 나올 수 있는 인덱스 배열의 최대값은 256이며, 그 안에서 모든 값이 표현될 수 있다.
인덱스 배열을 구성한 후, 비트 압축을 위한 정지 비트(stop bit)와 말미 비트(tail bit)를 구한다. 그리고 난 후, 버퍼의 데이터를 불러와서 그 데이터가 인덱스 배열의 몇 번째에 있는 데이터인지를 구하여 인덱스 표현을 위한 비트 패턴을 만든다.
만들어진 비트 패턴을 이용하여 인덱스 값과 사용된 개수의 합의 형태로 순차적으로 압축을 하게 되며 이때 인덱스 값의 표현에 두 번째 정지 비트를 초과하는 값에 대해서는 사용된 개수는 표현하지 않고 무조건 1개만 나열된 것으로 처리한다.
비트 패턴을 만든 다음에는 비트 패턴의 값을 압축하는데 두 번째 정지 비트를 초과하여 말미 비트를 필요로 하는가의 여부에 따라 말미 비트가 필요하다면 기록하기 위해 열어둔 파일에 기록을 하게 되고, 말미 비트가 필요가 없는 경우에는 연속된 데이터의 개수를 구하여 고정 정지 비트의 압축을 실행하여 기록하기 위해 열어둔 파일에 기록을 하고 데이터 압축의 과정을 끝내게 되는 것이다.
도 2는 본 발명의 데이터의 비트 인덱스 압축방법의 첫 번째와 두 번째 정지 비트의 조합인 정지 비트와 그 나머지 부분을 위한 말미 비트를 설정하는 과정을 나타내는 흐름도이다. 본 도면에 나타난 바와 같이, 도 1의 비트 압축을 위한 정지 비트와 말미 비트를 구하는 과정은 다음과 같다.
첫 번째 정지 비트를 위한 비율 1을 설정한 후, 인덱스 배열의 첫 번째 데이터로부터 여덟 번째 데이터까지 더하면서 비율 1과 비교를 한다. 1번째 데이터만 있는 경우에는 정지 비트가 0x80(이진수 10000000)으로 되어 커런트(current)가 1이 되고, 2번째 데이터까지만이면 정지 비트는 0x40(이진수 01000000)이 되어 커런트가 2가 되며, 4번째 데이터까지이면 정지 비트는 0x20(이진수 00100000)으로 되어 커런트가 4가 되며 8번째 데이터까지이면 정지 비트는 0x10(이진수 00010000)으로 되어 커런트가 8이 된다.
첫 번째 인덱스를 위한 값의 압축은 나올 수 있는 최대 값이 256으로 이미 고정되어 있지만 사용된 빈도수는 파일마다 각자 다르므로 정지 비트의 위치는 상황에 따라 가변적이며 사용되는 비트의 최대 값은 10비트로 고정되어 있다. 가변적인 정지 비트의 위치를 구하는 방법은 ###s##s###로 기본적인 비트 패턴을 정하고, 첫 번째 정지 비트의 위치는 파일에서 사용된 데이터를 바이트에서 적정 비율을 정하여 기본 비트 패턴처럼 4번째 비트를 벗어나지 않는 범위인 8개와 비교하여 작은 값을 취한다.
예컨대, 비율을 50%로 정하고 인덱스 배열의 상위 8개의 데이터의 사용 회수를 더하여 원하는 비율에 미치지 못한 경우에는 ###s 형태를 취하고, 만약 원하는 비율을 초과한 경우 그 비율에 해당하는 개수를 파악하여 비트 패턴을 정한다. 따라서, s, #s, ##s 등의 비트 패턴이 나올 수 있다. 최상위 인덱스의 데이터의 데이터 1개의 사용 회수가 50% 이상이면 s(1비트)가 될 것이며, 2개의 사용 회수를 더해야 50% 이상이라면 #s(2비트) 형태를 취하게 되고, 4개 이하의 사용 회수를 더해야 한다면 ##s(3비트)의 형태를 취하게 되며, 8개 이하 또는 그 이상의 사용 회수를 더해야 한다면 ###s(4비트) 형태의 비트 패턴이 결정될 것이다.
두 번째 정지 비트를 구하는 방법도 첫 번째 정지 비트를 정하는 방법과 같은 방법으로 비트 패턴을 결정한다. 즉, 두 번째 정지 비트를 위한 비율 2를 설정한 후, 인덱스 배열 커런트 번째의 데이터(커런트 + 32)로부터 데이터까지 더하면서 비율 2와 비교한 결과를 출력한다.
상기 출력된 결과값을 표현하기 위해 필요한 비트수를 구해야 하며, 상기 결과는 말미 정지 비트가 된다. 정지 비트와 말미 정지 비트가 같다면 전체 인덱스 배열의 크기에서 정지 비트의 필요 개수를 뺀 나머지를 출력하며 상기 출력된 나머지를 표현하기 위해 필요한 비트수를 구하여, 상기 구해진 필요한 비트수는 말미 비트가 된다.
도 3은 본 발명의 데이터의 비트 인덱스 압축방법의 비트 패턴을 정하는 실시예를 나타내는 예시도이다. 본 도면에 나타난 바와 같이, #를 값을 의미하는 비트이고 s를 정지 비트라고 가정하고, ###s###와 같은 형태로 비트 패턴을 정했다면첫 번째 정지 비트까지 나올 수 있는 값은 0000(십진수로는 0)부터 1110(십진수로는 7)까지 모두 8가지가 된다. 이 때, 정지 비트는 계산에서 빠지고 그 앞의 비트들만을 값으로 취한다. 만약 첫 번째 정지 비트가 1이면 값이 초과하게 되어 나오는 비트 값들을 합해서 원하는 수를 구하게 된다. 두 번째 정지 비트가 0이면 나올 수 있는 값은 00010000(십진수로는 8)부터 11111110(십진수로는 71)까지로서 모두 64가지가 되고 첫 번째 정지 비트에서 해결되지 않고 초과된 값이므로 표현 가능한 값은 모두 72(0부터 71)가지이다. 한편, 두 번째 정지 비트까지 1일 경우에는 말미 비트로 나올 수 있는 값은 모두 256가지이다.
이상과 같은 본 발명의 실시예는 다음과 같다. 본 실시예에서는 프로그램 소스중에서 압축의 핵심이 되는 부분만을 개시한 것으로 정렬 및 파일 입출력과 관련된 부분은 공지된 부분이므로 제외한다.
EA_CreateVIDXFileHeader
이 함수는 압축 파일의 헤더 부분을 구성하는 함수로 이 안에서 가변적인 정지 비트가 설정된다. 함수의 첫 번째 인수는 압축 파일의 헤더를 이 함수에서 생성해서 돌려주기 위한 포인터이다. 두 번째 인수는 이미 파일로부터 읽어 들인 데이터를 내림차순 정렬한 각각의 바이트 데이터와 개수가 들어있다. 다음이 그 함수이다.
int EA_CreateVIDXFileHeader (EAVIDXFileHeader** ppout, const EASortInfo* psi)
{
EAVIDXFileHeader* pvf = NULL;
const EASortInfo* p;
*ppout = NULL;
int cnt, bcnt, tcnt, bmsk, shft;
int i;
// 이 부분에서 정렬된 데이터의 합계를 구한다. 이 값은 파일의 총 크기와 같다.
for( i=0, tcnt=0, p=psi; i<256; i++, p++ ) {
if( p->count == 0 ) break;
tcnt += p->count;
}
if( i == 0 ) return -1;
// 압축 파일의 헤더 부분을 구성하기 위해 메모리를 할당 받는다.
if( (pvf = (EAVIDXFileHeader*)ECU_HeapAlloc(sizeof(EAVIDXFileHeader)
+ (--i))) == NULL )
return -1;
// 파일 헤더 초기 설정.
pvf->wEAType = EA_FILE_TYPE;
pvf->cVersion = 1;
pvf->dwUnpackSize = tcnt;
// 이 부분이 인덱스 배열을 구성하는 부분이다.
pvf->sVIDX.cCount = i;
for( i=0, p=psi; i<=pvf->sVIDX.cCount; i++, p++ )
pvf->sVIDX.cValue[i] = p->ch;
pvf->cTailBits = 0;
// 첫 번째와 두 번째 정지 비트 및 후미 비트를 구성하는 부분이다.
if( pvf->sVIDX.cCount < 2 ) {
pvf->cMaskBits = 0x80;
} else {
// 첫 번째 정지 비트 구성 부분이다. 비율은 파일 전체의 50%로 정했다.
bcnt = (int)(((float)tcnt) * 0.5);
for( i=0, p=psi; i<8; ) {
tcnt -= (p++)->count; i++;
if( tcnt <= bcnt ) break;
}
switch( i ) {
case 1: pvf->cMaskBits = 0x80; cnt = 1; shft = 0; break;
case 2: pvf->cMaskBits = 0x40; cnt = 2; shft = 1; break;
case 3: tcnt -= (p++)->count;
case 4: pvf->cMaskBits = 0x20; cnt = 4; shft = 2; break;
case 5: tcnt -= (p++)->count;
case 6: tcnt -= (p++)->count;
case 7: tcnt -= (p++)->count;
case 8: pvf->cMaskBits = 0x10; cnt = 8; shft = 3; break;
}
// 두 번째 정지 비트 구성 부분이다. 첫 번째 정지 비트 구성 후 남은 부분의 50%로 비율
// 을 정한다.
if( cnt <= pvf->sVIDX.cCount ) {
if( (cnt + 32) <= pvf->sVIDX.cCount ) {
bcnt = (int)(((float)tcnt) * 0.5);
for( i=0; i<32; ) {
tcnt -= (p++)->count; i++;
if( tcnt <= bcnt ) break;
}
bmsk = pvf->cMaskBits >> 1;
i = (i - 1) >> shft;
while( i ) {
bmsk >>= 1;
i >>= 1;
shft++;
}
pvf->cMaskBits |= bmsk;
bmsk = pvf->cMaskBits;
for( i=0, cnt=0; i<8; i++ ) {
( bmsk & 1 )? cnt |= 1 : cnt <<= 1;
bmsk >>= 1;
}
}
// 후미(tail) 비트 구성 부분.
cnt = (pvf->sVIDX.cCount + 1) - cnt;
cnt >>= shft;
for( i=0; ; ) {
i++; cnt >>= 1;
if( !cnt ) break;
}
pvf->cTailBits = i;
}
}
*ppout = pvf;
return 0;
}
EA_MakeVIDXInfoHeader
이 함수는 이미 구성된 압축 파일 헤더를 이용해서 압축에 필요한 정보를 구성한다. 인코딩 바로 전 단계에서 인코딩을 위해 구성한다.
int EA_MakeVIDXInfoHeader (EAVIDXInfoHeader* pvi, const EAVIDXFileHeader* pvf)
{
if( !pvi || !pvf ) return -1; // invalid param...
BYTE bmsk = pvf->cMaskBits;
// 첫 번째 정지 비트.
for( int i=0; i<4; i++ ) {
if( bmsk & 0x80 ) break;
bmsk <<= 1;
}
if( i == 4 ) return -1; // invalid VIDXMask...
pvi->sMask1.cMaskBit = 0x80 >> i;
pvi->sMask1.cMaskNum = (1 << i);
pvi->sMask1.cMaskMask = (1 << i) - 1;
pvi->sMask1.cMaskShft = i + 1;
// 두 번째 정지 비트.
bmsk <<= 1; i;
for( int j=0; i<6; i++, j++ ) {
if( bmsk & 0x80 ) break;
bmsk <<= 1;
}
if( i < 6 ) {
pvi->sMask2.cMaskBit = 0x80 >> (i + 1);
pvi->sMask2.cMaskNum = (1 << i);
pvi->sMask2.cMaskMask = (1 << j) - 1;
pvi->sMask2.cMaskShft = j + 1;
}
// tail...
for( i=0; i<pvf->cTailBits; i++ )
pvi->sMaskTail.cMaskMask = (1 << pvf->cTailBits) - 1;
pvi->sMaskTail.cMaskShft = pvf->cTailBits;
// index value...
const BYTE* p = pvf->sVIDX.cValue;
for( i=0; i<=pvf->sVIDX.cCount; i++ )
pvi->cValue[*p++] = i;
return 0; // success...
}
EA_EncodeVIDX
이 함수는 이미 구성된 압축 정보를 이용하여 바이트 데이터를 인코딩한다.
DWORD EA_EncodeVIDX (const EAVIDXInfoHeader* pvi, BYTE data)
{
if( !pvi ) return EA_INVALID_VIDX;
DWORD num = pvi->cValue[data];
DWORD shft1 = pvi->sMask1.cMaskShft;
DWORD shft2 = pvi->sMask2.cMaskShft;
DWORD shft3 = pvi->sMaskTail.cMaskShft;
DWORD bits = shft1;
if( num >= pvi->sMask1.cMaskNum ) {
num -= pvi->sMask1.cMaskNum;
bits += shft2;
if( num >= pvi->sMask2.cMaskNum ) {
num -= pvi->sMask2.cMaskNum;
num = (((1 << shft2) | 1) << shft3)
| ((num << 2) & (pvi->sMask1.cMaskMask << (shft2 + shft3 + 1)))
| ((num << 1) & (pvi->sMask2.cMaskMask << (shft3 + 1)))
| (num & pvi->sMaskTail.cMaskMask);
bits += shft3;
} else {
num = (1 << shft2)
| ((num << 2) & (pvi->sMask1.cMaskMask << (shft2 + 1)))
| ((num << 1) & (pvi->sMask2.cMaskMask << 1));
}
} else {
num = (num << 1);
}
return (num | (bits << 16));
}
EA_EncodeCIDX
이 함수는 고정 정지 비트 방식을 이용해서 바이트 데이터의 연속된 개수를 인코딩한다.
DWORD EA_EncodeCIDX (int nCount)
{
int spc[] = {
EA_CIDX_SPC1, EA_CIDX_SPC2, EA_CIDX_SPC3,
EA_CIDX_SPC4, EA_CIDX_SPC5, EA_CIDX_SPC6
};
int num = nCount;
int bits;
for( int i=0; i<6; i++ ) {
if( num <= spc[i] ) break;
num -= spc[i];
}
num--;
switch( i ) {
case 5:
num = ((num << 4) & 0x4000)
| ((num << 3) & 0x1000)
| ((num << 2) & 0x600)
| ((num << 1) & 0xE0)
| (num & 0xF)
| 0xA910;
bits = 16;
break;
case 4:
num = ((num << 4) & 0x400)
| ((num << 3) & 0x100)
| ((num << 2) & 0x60)
| ((num << 1) & 0xE)
| 0xA90;
bits = 12;
break;
case 3:
num = ((num << 3) & 0x40)
| ((num << 2) & 0x10)
| ((num << 1) & 0x6)
| 0xA8;
bits = 8;
break;
case 2:
num = ((num << 2) & 0x8)
| ((num << 1) & 0x2)
| 0x14;
bits = 5;
break;
case 1:
num = ((num << 1) & 0x2)
| 0x4;
bits = 3;
break;
case 0:
num = 0;
bits = 1;
break;
}
return (DWORD)(((WORD)num) | bits << 16);
}
본 발명의 효과는 하나의 파일 내에서 상대적으로 많이 사용되는 또는 연속적으로 나열된 바이트 데이터를 압축하기 위한 방법을 제공함으로써, 모든 휴대폰 어플리케이션에서 사용이 가능하고 모든 포맷에 대한 지원을 하며, 이미지 데이터 파일에 적용시킬 경우 이미지 데이터의 변형이 전혀 발생하지 않지 않으며, 사운드 포맷이나 각종 리소스에 사용할 수 있어 그 활용 범위가 넓을 뿐만 아니라 각종 피디에이(PDA)나 포켓 피씨(PC)와 같은 오에스(OS)를 동반한 각종 어플리케이션에서 활용이 가능하기 때문에 적은 데이터로 많은 양의 정보를 저장하여 사용할 수 있다.

Claims (3)

  1. 데이터를 압축하는 방법에 있어서, 하나의 파일 내에서 바이트 데이터의 사용된 개수를 파악하는 단계;
    상기 파악된 바이트 데이터들 중에서 많이 사용된 값을 기준으로 내림차순으로 정렬하는 단계;
    상기 정렬된 값을 기준으로 인덱스를 구성하는 단계;
    비트 압축을 위해 정지 비트와 말미 비트를 구하는 단계;
    일정 비율을 정하여 인덱스 표현을 위한 비트 패턴을 구성하는 단계;
    상기 구성된 비트 패턴을 이용하여 인덱스 값과 사용된 데이터 개수의 합의 형태로 순차적으로 압축하는 단계로 구성된 데이터의 비트 인덱스 압축방법
  2. 제 1항에 있어서, 상기 비트 압축을 위해 정지 비트와 말미 비트를 구하는 단계는
    첫 번째 정지 비트를 위한 비율 1(ratio 1)을 설정하는 단계;
    인덱스 배열의 1번 데이터부터 8번 데이터까지 더하면서 비율 1과 비교하는 단계;
    첫 번째 정지 비트를 생성하는 단계;
    두 번째 정지 비트를 위한 비율 2를 설정하는 단계;
    인덱스 배열 커런트 번째의 데이터부터 커런트와 32의 합까지의 데이터까지 더하면서 비율 2와 비교하는 단계;
    상기 비교된 결과를 출력하는 단계;
    상기 출력된 결과의 값을 표현하기 위해 필요한 비트수를 구하는 단계;
    상기 구해진 비트수를 이용하여 말미 정지 비트를 구하는 단계;
    전체 인덱스 배열의 크기에서 정지 비트의 필요한 개수를 뺀 나머지 결과를 구하는 단계;
    상기 구해진 결과를 표현하기 위한 비트수를 구하는 단계;
    상기 구해진 비트수를 이용하여 말미 비트를 구하는 단계로 구성됨을 특징으로 하는 데이터의 비트 인덱스 압축방법
  3. 제 2항에 있어서, 상기 비율은 정지 비트의 가변적인 위치에 따라 유동적으로 결정될 수 있으며 비율에 따라 비트 패턴이 결정되는 데이터 비트 인덱스 압축방법
KR1020010078392A 2001-12-12 2001-12-12 데이터의 비트 인덱스 압축방법 KR20020008101A (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020010078392A KR20020008101A (ko) 2001-12-12 2001-12-12 데이터의 비트 인덱스 압축방법

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020010078392A KR20020008101A (ko) 2001-12-12 2001-12-12 데이터의 비트 인덱스 압축방법

Publications (1)

Publication Number Publication Date
KR20020008101A true KR20020008101A (ko) 2002-01-29

Family

ID=19716914

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020010078392A KR20020008101A (ko) 2001-12-12 2001-12-12 데이터의 비트 인덱스 압축방법

Country Status (1)

Country Link
KR (1) KR20020008101A (ko)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100532275B1 (ko) * 2002-12-11 2005-11-29 삼성전자주식회사 이미지 압축방법

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR19980069645A (ko) * 1997-02-28 1998-10-26 김광호 데이타 압축 방법
KR20000050342A (ko) * 1999-01-07 2000-08-05 박인철 비손실 데이터 압축 및 신장방법
KR100271861B1 (ko) * 1996-01-31 2000-11-15 가나이 쓰도무 데이타압축, 신장방법 및 장치와 이것을 사용한 데이타처리장치 및 네트워크시스템
KR20000069633A (ko) * 1997-10-21 2000-11-25 아끼구사 나오유끼 파일 처리 방법, 데이터 처리 장치 및 기억 매체
KR20010042067A (ko) * 1998-03-20 2001-05-25 유니버시티 오브 메릴랜드 이미지 압축 복원 장치 및 방법
KR20010066401A (ko) * 1999-12-31 2001-07-11 김기영 한글 데이터의 압축 및 복원방법
KR20010075681A (ko) * 1999-09-07 2001-08-09 롤페스 요하네스 게라투스 알베르투스 프로세싱 시스템에서의 실행 인스트럭션 형성 방법
KR20010079359A (ko) * 2001-07-09 2001-08-22 전영삼 카드 블랙리스트 데이터의 압축방법 및 그의 전송시스템

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100271861B1 (ko) * 1996-01-31 2000-11-15 가나이 쓰도무 데이타압축, 신장방법 및 장치와 이것을 사용한 데이타처리장치 및 네트워크시스템
KR19980069645A (ko) * 1997-02-28 1998-10-26 김광호 데이타 압축 방법
KR20000069633A (ko) * 1997-10-21 2000-11-25 아끼구사 나오유끼 파일 처리 방법, 데이터 처리 장치 및 기억 매체
KR20010042067A (ko) * 1998-03-20 2001-05-25 유니버시티 오브 메릴랜드 이미지 압축 복원 장치 및 방법
KR20000050342A (ko) * 1999-01-07 2000-08-05 박인철 비손실 데이터 압축 및 신장방법
KR20010075681A (ko) * 1999-09-07 2001-08-09 롤페스 요하네스 게라투스 알베르투스 프로세싱 시스템에서의 실행 인스트럭션 형성 방법
KR20010066401A (ko) * 1999-12-31 2001-07-11 김기영 한글 데이터의 압축 및 복원방법
KR20010079359A (ko) * 2001-07-09 2001-08-22 전영삼 카드 블랙리스트 데이터의 압축방법 및 그의 전송시스템

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100532275B1 (ko) * 2002-12-11 2005-11-29 삼성전자주식회사 이미지 압축방법

Similar Documents

Publication Publication Date Title
US8120516B2 (en) Data compression using a stream selector with edit-in-place capability for compressed data
EP1832000B1 (en) Device and data method for selective compression and decompression and data format for compressed data
CN101095284B (zh) 用于有选择地压缩和解压缩数据的设备与方法
US5363098A (en) Byte aligned data compression
US7539685B2 (en) Index key normalization
US7663511B2 (en) Dynamic character encoding
WO1994022072A1 (en) Information processing using context-insensitive parsing
JPH08237138A (ja) 圧縮装置および圧縮方法
US8947272B2 (en) Decoding encoded data
JPH1079672A (ja) メッセージの圧縮及び圧縮解除の方法及び装置
US20020123882A1 (en) Compressed lexicon and method and apparatus for creating and accessing the lexicon
JPS6356726B2 (ko)
CA2741183A1 (en) Method and apparatus for compressing and decompressing data records
US6657564B2 (en) Method and apparatus for compressing data in which dictionary sizes are reduced
KR100495593B1 (ko) 파일 처리 방법, 데이터 처리 장치, 및 기억 매체
KR100764260B1 (ko) 프로세싱 시스템에서의 실행 인스트럭션 형성 방법
KR20020008101A (ko) 데이터의 비트 인덱스 압축방법
JP2785168B2 (ja) 単語検索のための電子辞書圧縮方法及び装置
CN110287147B (zh) 一种字符串排序方法及装置
Furht et al. Lossless JPEG image compression
Yamagiwa et al. Reducing Symbol Search Overhead on Stream-Based Lossless Data Compression
Hunt et al. Scala Collections Framework
JP3143030B2 (ja) データ圧縮方法及びその装置並びにデータ伸長方法及びその装置
Islam et al. Short text compression for smart devices
CN112612925A (zh) 数据的存储方法、读取方法以及电子设备

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E601 Decision to refuse application