用C语言将大块二进制文件转换成文本

用C语言将大块二进制文件转换成文本,c,binary,bitwise-operators,C,Binary,Bitwise Operators,我有一个项目,其中我应该通过getchar()函数接收一个文件,并将其中的二进制字符转换为文本 这是我的代码,它一次只能为一个生成正确的ASCII码。我不知道如何读入整个文本文件的二进制文件并将其转换: #include <stdio.h> #include <string.h> typedef unsigned char byte; typedef unsigned int uint; int strbin_to_dec(const char *); int ma

我有一个项目,其中我应该通过getchar()函数接收一个文件,并将其中的二进制字符转换为文本

这是我的代码,它一次只能为一个生成正确的ASCII码。我不知道如何读入整个文本文件的二进制文件并将其转换:

#include <stdio.h>
#include <string.h>

typedef unsigned char byte;
typedef unsigned int uint;

int strbin_to_dec(const char *);

int main(void) {



char * wbin = "01001001";
  int c = 0;

  printf("%s to ascii %d.\n", wbin, strbin_to_dec(wbin));
  printf("The character is %c", strbin_to_dec(wbin));
  return 0;
}

int strbin_to_dec(const char * str) {
  uint result = 0;
  for (int i = strlen(str) - 1, j = 0; i >= 0; i--, j++) {
    byte k = str[i] - '0';
    k <<= j;
    result += k;
  }
  return result;
}
我要翻译的文件如下所示:

0010001001001000011011110111011100100000011011110110011001110100011001010110111000100000011010000110000101110110011001010010000001001001001000000111001101100001011010010110010000100000011101000110111100100000011110010110111101110101
011101000110100001100001011101000010000001110111011010000110010101101110001000000111100101101111011101010010000001101000011000010111011001100101001000000110010101101100011010010110110101101001011011100110000101110100011001010110010000100000011101000110100001100101001000000110100101101101011100000110111101110011011100110110100101100010011011000110010100101100
01110111011010000110000101110100011001010111011001100101011100100010000001110010011001010110110101100001011010010110111001110011001011000010000001101000011011110111011101100101011101100110010101110010001000000110100101101101011100000111001001101111011000100110000101100010011011000110010100101100
01101101011101010111001101110100001000000110001001100101001000000111010001101000011001010010000001110100011100100111010101110100011010000011111100100010
0010110101010011011010010111001000100000010000010111001001110100011010000111010101110010001000000100001101101111011011100110000101101110001000000100010001101111011110010110110001100101001011000010000001010100011010000110010100100000010100110110100101100111011011100010000001001111011001100010000001000110011011110111010101110010

读入文件中的所有输入,并一次向转换器函数传递8个字符以返回一个字符。每个字符是8位,文件中的每个字符代表1位

char string_to_character(char * in)
{
  char ret = 0;
  int i;
  for(i = 7; i >= 0; i--)
    if(in[i] == '1')
      ret += 1 << (7 - i);

  return ret;
}
char字符串到字符(char*in)
{
char-ret=0;
int i;
对于(i=7;i>=0;i--)
如果(在[i]=“1”中)
ret+=1=不>

用于循环

假设您将整个文件作为一个长字符串

int num_chars = (sizeof(input) / sizeof(char)) / 8;
int i;
char output[num_chars + 1];
for(i = 0; i < num_chars; i++)
   output[i] = string_to_character(input + (i * 8));

printf("%s", output);
int num_chars=(sizeof(input)/sizeof(char))/8;
int i;
字符输出[num_chars+1];
对于(i=0;i
这是我从节目中得到的结果

“我有多少次对你说过,当你消除了不可能的事情,剩下的无论多么不可能,都一定是真相?”-亚瑟爵士 柯南·道尔,四的标志


编辑:left bitshift vs pow

这是我做的一个函数!我不知道您是否使用该文件作为执行参数,如:./text.exe-f binary.txt!但我不向程序添加条目!我自己定义了该文件

我已经创建了一个函数来写入文件,但是如果你想使用像./text.exe-f binary.txt>translatedfile.txt这样的命令,你可以简单地删除函数write_to_file!不要忘记删除你不想要的打印,因为参数“>”会打印所有内容

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void binary_to_char(char *str);
void write_to_file(char *text);

int main(void)
{

    printf("Getting line from file\n");

    FILE *file;
    char *line = NULL;
    size_t len = 0;
    ssize_t stringLength;

    file = fopen("binary.txt", "r");
    if (file == NULL)
    {
        fprintf(stderr, "[ERROR]: cannot open file -- binary.txt");
        perror("");
        exit(1);
    }

    while ((stringLength = getline(&line, &len, file)) != -1)
    {
        printf("\n%s", line);
        binary_to_char(line);
    }
    free(line);
    fclose(file);

    return 0;
}

void binary_to_char(char *str)
{
    char binary[9];
    char *text = malloc((strlen(str) + 1) * sizeof(char));
    char c;
    int pos = 0;
    int letter_pos = 0;
    printf("\nConverting into characters\n");
    for (size_t j = 0; j < strlen(str) / 8; j++)
    {
        for (int i = 0; i < 8; i++)
        {
            binary[i] = str[pos];
            pos++;
        }
        c = strtol(binary, 0, 2);
        text[letter_pos] = c;
        letter_pos++;
    }
    printf("\n%s\n", text);
    write_to_file(text);
    free(text);
}

void write_to_file(char *text)
{
    printf("\nContent saved to translatedfile.txt\n");
    FILE *fp;

    fp = fopen("translatedfile.txt", "w+");
    fprintf(fp, "%s", text);

    fclose(fp);
}
001000100100100001101111011101110010000001101111011001100111010001100101011011100010000001101000011000010111011001100101001000000100100100100000011100110110000101101001011001000010000001110100011011110010000001111001011011110111010101110100011010000110000101110100001000000111011101101000011001010110111000100000011110010110111101110101001000000110100001100001011101100110010100100000011001010110110001101001011011010110100101101110011000010111010001100101011001000010000001110100011010000110010100100000011010010110110101110000011011110111001101110011011010010110001001101100011001010010110001110111011010000110000101110100011001010111011001100101011100100010000001110010011001010110110101100001011010010110111001110011001011000010000001101000011011110111011101100101011101100110010101110010001000000110100101101101011100000111001001101111011000100110000101100010011011000110010100101100011011010111010101110011011101000010000001100010011001010010000001110100011010000110010100100000011101000111001001110101011101000110100000111111001000100010110101010011011010010111001000100000010000010111001001110100011010000111010101110010001000000100001101101111011011100110000101101110001000000100010001101111011110010110110001100101001011000010000001010100011010000110010100100000010100110110100101100111011011100010000001001111011001100010000001000110011011110111010101110010

这是一项简单的任务,只需使用位移位即可完成。此外,为了提高性能,下面使用了
fread
,而不是使用
getchar

此实现使用最小的RAM(不使用malloc)、无慢速字符串解析或数学函数,如
strlen
strtol
pow
,并且可以处理无限大小/长度的任何流,包括不是8字节倍数的截断流

用法:
/a.outout.txt

#包括
int main(int argc,char*argv[])
{
无符号字符字节=0;
整数位=0;
对于(;;)
{
字符缓冲区[1024];
int len=fread(缓冲区,1,sizeof(缓冲区),stdin);
//如果出现读取错误或EOF,请停止

如果(len)是您的问题“如何从文件中读取字符”?事实上,看起来你甚至不需要从一个文件中读取,而是从一个重定向的
stdin
中读取,为什么不使用循环?但你想让它只翻译一个字符或整个字符串?@EugeneSh。如果我正确地跟踪了你,那么这就是我正在做的,但我现在不知道如何翻译整个内容。这与读取fi不同le in,从我使用FILE对象可以看出。我是C新手,如果我的术语不正确,我很抱歉。@GonçaloBastos我需要翻译我文章底部的整个文本块,这是一本书中的引用,但我不知道如何循环二进制文件并获取我需要提供给函数的内容。这个答案是e非常差。它不仅需要先读取整个输入(对于读取
stdin
无效,并且限制输入大小),它还使用
malloc
strlen
strol
来完成简单的位移位操作。@Geoffrey好的,我只是想帮忙!这不仅需要读取整个文件,还需要使用
pow
来完成简单的
可以完成的操作,左移位简直是疯了。@Geoffrey Fair,左移效率更高。但问题需要读取整个文件,这是不可避免的。需要读取整个文件。是的,但不需要将整个文件缓冲到RAM中,也不需要按照OP的要求读取
stdin
。输入的长度不是确定的,而且不需要ld是无限的。看我的答案。它肯定会运行得慢得多,因为磁盘访问时间比ram访问慢几百倍。说什么?无论如何,你都必须从磁盘上读取文件。这是一个从stdin读取到malloc'ed-region,从二进制转换到malloc'ed-region,还是从二进制转换的问题f-of-stdin。我不认为后者不是一场胜利。另请参见和。为什么你必须反复阅读文件?我认为一次传球就可以了。
001000100100100001101111011101110010000001101111011001100111010001100101011011100010000001101000011000010111011001100101001000000100100100100000011100110110000101101001011001000010000001110100011011110010000001111001011011110111010101110100011010000110000101110100001000000111011101101000011001010110111000100000011110010110111101110101001000000110100001100001011101100110010100100000011001010110110001101001011011010110100101101110011000010111010001100101011001000010000001110100011010000110010100100000011010010110110101110000011011110111001101110011011010010110001001101100011001010010110001110111011010000110000101110100011001010111011001100101011100100010000001110010011001010110110101100001011010010110111001110011001011000010000001101000011011110111011101100101011101100110010101110010001000000110100101101101011100000111001001101111011000100110000101100010011011000110010100101100011011010111010101110011011101000010000001100010011001010010000001110100011010000110010100100000011101000111001001110101011101000110100000111111001000100010110101010011011010010111001000100000010000010111001001110100011010000111010101110010001000000100001101101111011011100110000101101110001000000100010001101111011110010110110001100101001011000010000001010100011010000110010100100000010100110110100101100111011011100010000001001111011001100010000001000110011011110111010101110010
0010001001001000011011110111011100100000011011110110011001110100011001010110111000100000011010000110000101110110011001010010000001001001001000000111001101100001011010010110010000100000011101000110111100100000011110010110111101110101
011101000110100001100001011101000010000001110111011010000110010101101110001000000111100101101111011101010010000001101000011000010111011001100101001000000110010101101100011010010110110101101001011011100110000101110100011001010110010000100000011101000110100001100101001000000110100101101101011100000110111101110011011100110110100101100010011011000110010100101100
01110111011010000110000101110100011001010111011001100101011100100010000001110010011001010110110101100001011010010110111001110011001011000010000001101000011011110111011101100101011101100110010101110010001000000110100101101101011100000111001001101111011000100110000101100010011011000110010100101100
01101101011101010111001101110100001000000110001001100101001000000111010001101000011001010010000001110100011100100111010101110100011010000011111100100010
0010110101010011011010010111001000100000010000010111001001110100011010000111010101110010001000000100001101101111011011100110000101101110001000000100010001101111011110010110110001100101001011000010000001010100011010000110010100100000010100110110100101100111011011100010000001001111011001100010000001000110011011110111010101110010
"How often have I said to youthat when you have eliminated the impossible,whatever remains, however improbable,must be the truth?"-Sir Arthur Conan Doyle, The Sign Of Four