2013-10-07 96 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

FILE *inputFile; 
FILE *outputFile; 

int encodeBinary[4] = {0x00, 0x01, 0x02, 0x03}; 
char encodeChars[4] = {':', '@', '\n', ' '}; 

void encode(const char * inFile, const char * outFile) 
{ 

    inputFile = fopen(inFile, "r"); 
    outputFile = fopen(outFile, "w"); 
    char lineBuffer[BUFSIZ]; 

    if(inputFile == NULL) 
    { 
     perror("Error while opening file.\n"); 
     exit(EXIT_FAILURE); 
    } 

    while(fgets(lineBuffer, sizeof(lineBuffer), inputFile)) 
    { 
     for(int i = 0; lineBuffer[i] != 0; i++) 
     { 
      if(lineBuffer[i] == encodeChars[0]) 
      { 
       fprintf(outputFile, "%d", encodeBinary[0]); 
      } 
      else if(lineBuffer[i] == encodeChars[1]) 
      { 
       fprintf(outputFile, "%d", encodeBinary[1]); 
      } 
      else if(lineBuffer[i] == encodeChars[2]) 
      { 
       fprintf(outputFile, "%d", encodeBinary[2]); 
      } 
      else if(lineBuffer[i] == encodeChars[3]) 
      { 
       fprintf(outputFile, "%d", encodeBinary[3]); 
      } 
     } 
    } 

    fclose(inputFile); 
    fclose(outputFile); 

} 

void decode(const char * inFile, const char * outFile) 
{ 

    inputFile = fopen(inFile, "r"); 
    outputFile = fopen(outFile, "w"); 
    char lineBuffer[BUFSIZ]; 

    if(inputFile == NULL) 
    { 
     perror("Error while opening file.\n"); 
     exit(EXIT_FAILURE); 
    } 

    while(fgets(lineBuffer, sizeof(lineBuffer), inputFile)) 
    { 
     for(int i = 0; lineBuffer[i] != 0; i++) 
     { 
      if(lineBuffer[i] == '0') 
      { 
       fprintf(outputFile, "%c", encodeChars[0]); 
      } 
      else if(lineBuffer[i] == '1') 
      { 
       fprintf(outputFile, "%c", encodeChars[1]); 
      } 
      else if(lineBuffer[i] == '2') 
      { 
       fprintf(outputFile, "%c", encodeChars[2]); 
      } 
      else if(lineBuffer[i] == '3') 
      { 
       fprintf(outputFile, "%c", encodeChars[3]); 
      } 
     } 
    } 

    fclose(inputFile); 
    fclose(outputFile); 

} 


void commands(const char * command, const char * inputFile, const char * outputFile) 
{ 
    if(strcmp(command, "encode") == 0) 
    { 
     encode(inputFile, outputFile); 
    } 
    else if(strcmp(command, "decode") == 0) 
    { 
     decode(inputFile, outputFile); 
    } 
} 

void testValues(int argc, const char * argv[]) 
{ 
    if(argc == 4) 
    { 
     commands(argv[1], argv[2], argv[3]); 
    } 
    else 
     printf("USAGE: ./encode [input_file] [output_file]\n"); 
} 

//MAIN 
int main(int argc, const char * argv[]) 
{ 

    testValues(argc, argv); 

    return 0; 
} 

你好。我有這段代碼。代碼應該得到一個由字符組成的文本文件:@「newline」和「space」。這些字符然後應該被轉換爲二進制,0,1,10,11。之後,我還需要一種方法來解碼回原始字符。我似乎無法弄清楚的是如何能夠讀取數字之間的差異,如果有001,我怎麼知道我們正在談論0,01,而不是00,1。我在某處讀到你可以使用按位操作來做到這一點?任何幫助感謝!c中的編碼和解碼文本

所以,我已經改變了一下我的代碼。現在問題是,當我存儲值時,編碼的文件與要編碼的文件一樣大。如何將值存儲在文件中,以便將值存儲爲十六進制(或二進制),以便編碼文件小於原始文件?

+1

字符是7位(不是必須的)不爲2或3位 – haccks

+0

的是。 ,但是我要將這些字符表示爲每個2位 –

+0

我應該已經更清楚了,但是我必須帶一個帶字符的文件,然後將它們編碼爲另一個文件以進行二進制編碼以節省空間,我該怎麼做? –

回答

1

{0, 1, 10, 11};不是二進制數,它們是十進制數,這是C源代碼中的默認數字格式。其他可能的數字基地是十六進制,用前綴0x和八進制編寫,前綴爲0。沒有辦法在標準C代碼中編寫二進制數字(可能是因爲人們認爲它們難以閱讀)。

所以,你必須做的是十六進制鍵入數字:

{0x00, 0x01, 0x02, 0x03} 

的算法是相當直接:

  • 從文件中讀取一個字符。
  • encodeChars(它應宣佈爲const char [])中搜索該字符的匹配項。
  • 如果找到,請將其替換爲「binary」中的相應索引。
  • 解碼是相反的方式,只是使用二進制作爲查找表。
  • 如果性能很重要,請考慮使用二進制搜索實現此功能。這是二進制搜索應該使用的理想例子(分類數據,不重複)。

編輯

我說的是什麼了程序員的數字表示,程序員自己的源代碼內。在這裏你只能使用十進制,十六進制和八進制。

還有用戶的數字表示形式,我想這正是您要查找的內容。這可以是任何你喜歡的東西。

最後是CPU的數字表示。他只想要二進制文件而不是二進制文件。

考慮一下:printf("%c", 0x41).

  • 程序員看到六角41
  • 用戶看到以字母A
  • 的CPU看到像在棧上「門店數量01000001跳轉到子程序。「

要顯示一些隨機字節作爲一個二進制數的所述用戶,只需做類似:

#include <stdint.h> 

uint8_t data = 0x41; 

for(uint8_t i=0; i<8; i++) 
{ 
    if((data & (1<<i)) > 0) 
    { 
    printf("1"); 
    } 
    else 
    { 
    printf("0"); 
    } 

} 
+0

謝謝你的努力,但我必須以二進制形式表示數字,而不是八進制或十六進制。 –

+0

@HatoriSa NSO;計算機將它們視爲二進制而不是八進制或十六進制! – haccks

+1

你可以使用非標準['0b'前綴](http://stackoverflow.com/a/2612556/249237),它可以在幾個編譯器(至少GCC,TCC和Clang)中工作 – Kninnug