簡體   English   中英

用c編碼和解碼文本

[英]Encoding and Decoding text in c

#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。我讀到了某個地方可以使用按位運算來做到這一點? 任何幫助表示贊賞!

因此,我對代碼做了一些更改。 現在的問題是,當我存儲值時,已編碼的文件與要編碼的文件一樣大。 如何以一種將值存儲為十六進制(或二進制)的方式將值存儲在文件中,以使編碼后的文件小於原始文件?

{0, 1, 10, 11}; 不是二進制數字,而是十進制數字,這是C源代碼中的默認數字格式。 其他可能的數字基數是十六進制的前綴0x和八進制的前綴0 無法用標准C代碼編寫二進制數字(可能是因為人們難以理解二進制數字)。

因此,您要做的是用十六進制鍵入數字:

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

該算法非常簡單:

  • 從文件中讀取一個字符。
  • encodeChars (應將其聲明為const char [] )中搜索此字符的匹配項。
  • 如果找到,將其替換為“二進制”中的相應索引。
  • 解碼是另一種方式,只需使用二進制作為查找表即可。
  • 如果性能很重要,請考慮使用二進制搜索來實現。 這是應在何處使用二進制搜索(排序的數據,沒有重復項)的理想示例。

編輯

我講的是對程序員的數字表示,程序員自己的源代碼內。 在這里,您只能使用十進制,十六進制和八進制。

還有用戶的數字表示形式,我想這就是您想要的。 這可以是您喜歡的任何東西。

最后是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");
  }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM