[英]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).
要顯示一些隨機字節的二進制數的用戶 ,只需做一些事情,如:
#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.