2013-10-07 60 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