2017-10-21 39 views
-5

Nous avons reçu une affectation dans laquelle nous devons compresser 4 octets en 3 octets. Il veut que nous ayons une compression de 25%, en plaçant les caractères en 6 bits au lieu de 8 bits. Cela devrait être une compression exacte de 25%, mais mon programme en fait environ 50%. Code Book est mon propre type de table "ASCII", Les opérateurs bitwise sont utilisés pour effectuer la compression. Quelqu'un a-t-il une idée de la raison pour laquelle il la compresse de 50% plutôt que de 25%? Je sais que l'espace de noms std n'est pas une bonne pratique, mais on nous demande de l'utiliser. Merci `Compression en C++ à l'aide d'opérateurs au niveau du bit

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

unsigned char CodeBook[53][2]; 

unsigned char FindCharacterCode(unsigned char C) 
{ 
    for (int j = 0; j < 53; j++) 
    if (CodeBook[j][0] == C) 
    return CodeBook[j][1]; 
    return 0; 
} 

void MyCodeBook() 
{ 
    CodeBook[0][0] = 'a'; CodeBook[0][1] = 1; 
    CodeBook[1][0] = 'b'; CodeBook[1][1] = 2; 
    CodeBook[2][0] = 'c'; CodeBook[2][1] = 3; 
    CodeBook[3][0] = 'd'; CodeBook[3][1] = 4; 
    CodeBook[4][0] = 'e'; CodeBook[4][1] = 5; 
    CodeBook[5][0] = 'f'; CodeBook[5][1] = 6; 
    CodeBook[6][0] = 'g'; CodeBook[6][1] = 7; 
    CodeBook[7][0] = 'h'; CodeBook[7][1] = 8; 
    CodeBook[8][0] = 'i'; CodeBook[8][1] = 9; 
    CodeBook[9][0] = 'j'; CodeBook[9][1] = 10; 
    CodeBook[10][0] = 'k'; CodeBook[10][1] = 11; 
    CodeBook[11][0] = 'l'; CodeBook[11][1] = 12; 
    CodeBook[12][0] = 'm'; CodeBook[12][1] = 13; 
    CodeBook[13][0] = 'n'; CodeBook[13][1] = 14; 
    CodeBook[14][0] = 'o'; CodeBook[14][1] = 15; 
    CodeBook[15][0] = 'p'; CodeBook[15][1] = 16; 
    CodeBook[16][0] = 'q'; CodeBook[16][1] = 17; 
    CodeBook[17][0] = 'r'; CodeBook[17][1] = 18; 
    CodeBook[18][0] = 's'; CodeBook[18][1] = 19; 
    CodeBook[19][0] = 't'; CodeBook[19][1] = 20; 
    CodeBook[20][0] = 'u'; CodeBook[20][1] = 21; 
    CodeBook[21][0] = 'v'; CodeBook[21][1] = 22; 
    CodeBook[2][0] = 'w'; CodeBook[22][1] = 23; 
    CodeBook[23][0] = 'x'; CodeBook[23][1] = 24; 
    CodeBook[24][0] = 'y'; CodeBook[24][1] = 25; 
    CodeBook[25][0] = 'z'; CodeBook[25][1] = 26; 
    CodeBook[26][0] = '0'; CodeBook[26][1] = 27; 
    CodeBook[27][0] = '1'; CodeBook[27][1] = 28; 
    CodeBook[28][0] = '2'; CodeBook[28][1] = 29; 
    CodeBook[29][0] = '3'; CodeBook[29][1] = 30; 
    CodeBook[30][0] = '4'; CodeBook[30][1] = 31; 
    CodeBook[31][0] = '5'; CodeBook[31][1] = 32; 
    CodeBook[32][0] = '6'; CodeBook[32][1] = 33; 
    CodeBook[33][0] = '7'; CodeBook[33][1] = 34; 
    CodeBook[34][0] = '8'; CodeBook[34][1] = 35; 
    CodeBook[35][0] = '9'; CodeBook[35][1] = 36; 
    CodeBook[36][0] = '!'; CodeBook[36][1] = 37; 
    CodeBook[37][0] = '$'; CodeBook[37][1] = 38; 
    CodeBook[38][0] = '('; CodeBook[38][1] = 39; 
    CodeBook[39][0] = ')'; CodeBook[39][1] = 40; 
    CodeBook[40][0] = '#'; CodeBook[40][1] = 41; 
    CodeBook[41][0] = '&'; CodeBook[41][1] = 42; 
    CodeBook[42][0] = '%'; CodeBook[42][1] = 43; 
    CodeBook[43][0] = '-'; CodeBook[43][1] = 44; 
    CodeBook[44][0] = '.'; CodeBook[44][1] = 45; 
    CodeBook[45][0] = ','; CodeBook[45][1] = 46; 
    CodeBook[46][0] = '\''; CodeBook[46][1] = 47; 
    CodeBook[47][0] = ';'; CodeBook[47][1] = 48; 
    CodeBook[48][0] = ':'; CodeBook[48][1] = 49; 
    CodeBook[49][0] = '?'; CodeBook[49][1] = 50; 
    CodeBook[50][0] = ' '; CodeBook[50][1] = 51; 
    CodeBook[51][0] = ' '; CodeBook[51][1] = 52; 
    CodeBook[52][0] = '¶'; CodeBook[52][1] = 53; 

} 

int main() 
{ 

    MyCodeBook(); 

    ifstream In; 
    ofstream Out; 

    In.open("C://Users//osama//Desktop//code.txt"); 
    Out.open("C://Users//osama//Desktop//compressed.txt"); 

    unsigned char Data[4] = { 0 }, 
    Compressed[3] = { 0 }, Code[4] = { 0 }; 
    int i; 

    while (!In.eof()) 
    { 

     if (In.is_open()) 
     { 
      for (i = 0; i < 4; i++) 
      { 
       In >> Data[i]; 
       Code[i] = FindCharacterCode(Data[i]); 
      } 
     } 
     else 
     { 
      cout << "Not open!" << endl << endl; 
      return -1; 
     } 

     Compressed[0] = Code[0] << 2; 
     Compressed[0] = (Compressed[0] | Code[1] >> 4); 

     Compressed[1] = (Code[1] << 4); 
     Compressed[1] = (Compressed[1] | Code[2] >> 2); 

     Compressed[2] = (Code[2] << 6); 
     Compressed[2] = Compressed[2] | Code[3]; 

     for (i = 0; i < 3; i++) 
     { 
       Out << Compressed[i]; 
     } 

    } 

    In.close(); 
    Out.close(); 



    return 0; 
} 
+0

S'il vous plaît prendre un certain temps pour lire [les pages d'aide] (http://stackoverflow.com/help), en particulier les sections nommées ["Quels sujets puis-je poser à propos ici?"] (Http://stackoverflow.com/help/on-topic) et ["Quels types de questions devrais-je éviter de poser?"] (Http://stackoverflow.com/ aide/ne demande pas). Aussi s'il vous plaît [faire le tour] (http://stackoverflow.com/tour) et [lire sur la façon de poser de bonnes questions] (http://stackoverflow.com/help/how-to-ask). Enfin, apprenez comment créer un [** Exemple ** minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve). –

+0

"Est-ce que quelqu'un a une idée de pourquoi ça fait ça?" Qu'est-ce qu'il fait qui est inattendu? S'il vous plaît expliquer le problème que vous rencontrez plus en détail. –

+0

J'ai mentionné qu'il compresse 50% environ, on nous demande de compresser de 25% ..... –

Répondre

1

Astuce:

Pour toute entrée donnée de votre algorithme de compression, vous obtiendrez un nombre compris entre 1 et 53 (appelons-le 0 et 53).

De combien de bits avons-nous besoin pour un nombre aussi grand?

1? dans un bit, nous pouvons stocker entre 0 et 1 - trop petit.

2? en 2 bits on peut stocker entre 0 et 3 - trop petit.

...

5? en 5 bits on peut stocker entre 0 et 31 - trop petit.

6? en 6 bits on peut stocker entre 0 et 63 - assez grand.

les entrées sont des caractères ou des octets - 8 bits.

6/8 * 100 = 75%

Voici votre compression de 25%.

Maintenant, vous devez comprendre comment encoder 4 lots de 6 bits en 3 octets de 8 bits.

C'est là vos opérateurs (et un peu au niveau du bit décalage de bits) viendront.

+0

J'ai eu cette chose 6 bits. Donc, vous pensez que le transfert de bits a quelques problèmes? Avec 4 caractères, taille 4 octets dans le fichier d'entrée, il donne 3 octets au fichier compressé. Mais 419 octets originaux sont convertis en 264 octets, ne savent pas pourquoi .... le décalage de bit est le problème que vous pensez? –

+0

@OsamaAsifCInfinitum Voir les commentaires [ici] (http://coliru.stacked-crooked.com/a/f133925a9258d9a5) –