RLE算法解码 - 转义字符

时间:2013-11-27 02:02:51

标签: c

我必须做一个能够对每个文件进行编码和解码的rle算法(转义字符)。 我做了第一部分(编码),现在已经开始解码部分,我可以看到一些问题。例如:

如果我有一个文件,里面有:AAAAABBBBBBCCCCCDDD
我做的编码函数给出了这样的输出:QA5QB6QC5DDD

但你必须认为我必须使用真实文件,所以里面不仅有字母,还有数字和符号。

那么,在编码部分之后,如果在编码文件中有QA55之类的东西,我必须做什么? 输出必须是AAAAA5或五十五A

另一个例子,如果我必须阅读QA5
哪个是最终输出? AAAAA或仅QA5

我的意思是我不知道当我正在阅读的字母块是否有编码时,我怎么能识别出来。

这是我的编码功能:

void encode (FILE *source, FILE *destination) {
    char currentChar;
    char seqChar = 'Z'; //could be any character
    int count = 0;

    while(1) {
      int endFile = (fread(&currentChar, sizeof(char),1, source) == 0); 

      if(endFile || seqChar!=currentChar) {

         if(count>3) {
           char escape = 'Q';
           int k = count; 
           char str[100];
           int digits = sprintf(str,"%d",count); 
           fwrite(&escape, sizeof(escape), 1, destination);
           fwrite(&seqChar, sizeof(escape),1, destination);
           fwrite(&str, sizeof(char), digits, destination);
         }
         else {
           for(int i=0;i<count;i++) 
              fwrite(&seqChar,sizeof(char),1,destination);
         }
         seqChar = currentChar;
         count =1;
      }

     else count++;

     if(endFile)
       break;
    }

   fclose(source);
   fclose(destination);
}

我希望你知道我的意思,
当然,我认为,为了解决这个问题,我必须发明一些惯例,但我无法弄清楚哪种和那种。

1 个答案:

答案 0 :(得分:1)

如何在C字符串中放置文字反斜杠?你如何用printf写一个百分号?您必须找到表示转义字符本身的转义序列。

你的逃脱角色是 Q (顺便说一下,这是个奇怪的选择)。然后 Q + 字符 + 计数可能意味着:字符计数次。 QQ 可能意味着逃脱角色本身。

你会发现你不能用这种方式压缩 Q 的序列,因为 Q 已经意味着“Q”。解决这个问题有两种可能性:摆脱 QQ 的特殊含义,并始终将“Q”编码为一个“Q”的序列,即。的 QQ1 即可。或者将计数放在要编码的字符前面,并使 Q 不是有效计数。

(顺便说一下,这不是一个C问题,而是更多关于压缩算法的设计。你可能想重新标记它并删除代码。)