开发者

RLE: encode by two symbols

I've created RLE encoding function, which encodes sequences like "A1A1B7B7B7B7" to such strings: "#A12#B74".

  void encode(const char *input_path, const char *output_path)
  { // Begin of SBDLib::SBIMask::encode
    std::fstream input(input_path, std::ios_base::in | std::ios_base::binary);
    std::fstream output(output_path, std::ios_base::out | std::ios_base::binary);
    int size = 0; // Set size variable
    input.seekg(0, std::ios::end); // Move to EOF
    size = input.tellg(); // Tell position
    input.seekg(0); // Move to the beginning
    int i = 1; // Create encoding counter
    int counter = 0; // Create color counter
    int cbyte1, cbyte2; // Create current color bytes
    int pbyte1 = 0x0; int pbyte2 = 0x0; // Create previous color bytes
    while (((cbyte1 = input.get()) != EOF && (cbyte2 = input.get()) != EOF)
          || input.tellg() >= size)
    { // Begin of while
      // If current开发者_JAVA技巧 bytes are not equal to previous bytes
      // or cursor is at the end of the input file, write
      // binary data to file; don't do it if previous bytes
      // were not set from 0x0 to any other integer.
      if (((cbyte1 != pbyte1 || cbyte2 != pbyte2)
         || (input.tellg() == size))
         && (pbyte1 != 0x0 && pbyte2 != 0x0))
      { // Begin of main if
          output << SEPARATOR; // Write separator to file
          output.write(reinterpret_cast<const char*>(&pbyte1), 1);
          output.write(reinterpret_cast<const char*>(&pbyte2), 1);
          output << std::hex << counter; // Write separator, bytes and count
          counter = 1; // Reset counter
      } // End of main if
      else counter++; // Increment counter
      pbyte1 = cbyte1; pbyte2 = cbyte2; // Set previous bytes
    } // End of main while
  } // End of encode

However, function is not as fast as I need. This is the second version of function, I've already improved it to make it faster, but it is still too slow. Do you have any ideas how to improve? I'm lack of ideas.


Depending on the size of data you are reading from files it might be a good idea not to read single charcaters but a chunk of data from your input file at once. This might be a lot faster than accessing the input file on the disk for each input character.

Pseudo code example:

char dataArray[100];

while( !EOF )
{
  input.get( &dataArray[0], 100 ); // read a block of data not a single charater

  process( dataArray ); // process one line
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜