[英]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.