gpt4 book ai didi

c - c 中的编码和解码文本

转载 作者:行者123 更新时间:2023-11-30 15:45:06 26 4
gpt4 key购买 nike

#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;
}

你好。我有这段代码。该代码应该获取一个由字符组成的文本文件:@“换行符”和“空格”。然后这些字符应该被转换为二进制,0,1,10,11。之后我还需要一种方法来解码回原始字符。我似乎不明白的是如何能够读取数字之间的差异,如果有 001,我怎么知道我们正在谈论 0, 01,而不是 00, 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");
}

}

关于c - c 中的编码和解码文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19226698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com