【问题标题】:How to read file, convert binary buffer to binary string and later convert the binary string to binary buffer again in C?如何读取文件,将二进制缓冲区转换为二进制字符串,然后在 C 中再次将二进制字符串转换为二进制缓冲区?
【发布时间】:2016-09-16 16:17:09
【问题描述】:

我想编写一个可以读取文件的程序,比如说 myfile.bin,将缓冲区转换为二进制“字符串”(“101110111011...”),将其存储在 char* 变量中。稍后,我希望能够再次将该二进制“字符串”转换为二进制缓冲区并创建另一个文件,例如 myanotherfile.bin,其内容与第一个文件完全相同。

请注意,我不是在尝试从文件中读取文本。

我看到很多人在谈论如何做第一部分,但直到现在,我找不到任何人在谈论第二部分(如何从从前一个文件创建的二进制字符串创建二进制文件) .

更新

这是我用来读取文件并生成“二进制字符串”的代码:

#import <stdio.h>
#import <limits.h>
#import <stdlib.h>

int main() {
  char buffer[32];
  FILE *file = fopen("myfile.bin","rb");
  if (file == NULL) { fclose (file); }

  size_t count;
  while ((count = fread(buffer, sizeof buffer[0], sizeof buffer, file)) > 0) {
    for (size_t j = 0; j < count; j++ ) {
      for (int i = CHAR_BIT-1; i >= 0; i--) {
        fputc(buffer[j] & (1u << i) ? '1' : '0', stdout);
      }
    }
  }
  fclose(file);

  return 0;
}

以上代码输出一个二进制字符串如:“1110011101101....”。

这是第一部分。第二部分是获取该字符串并创建一个文件。这可能吗?

谢谢。

【问题讨论】:

    标签: c string file binary


    【解决方案1】:

    也许你需要这样的东西:

    • 首先读取您的文件并将所有内容保存在一个字符串中。

    • 然后就可以调用这个函数了:

      char * string_to_binarystring(char* s,int size)
      {
         char output[9];
         char * return_str = malloc(size*8+1);
         return_str[0] = '\0';
         while (*s)
         {
            itoa(*s, output, 2);
      
            strcat(return_str,output);
            ++s;
         }
         return return_str;
      }
      

      例如这样:

      char string[] = "Hello World";
      
      puts(string_to_binarystring(string,strlen(string)));
      
      • 最后将您的字符串打印到文件中。

    提示

    要写入你需要的二进制文件:

        char mystring[] = "Hello World";
        FILE *ptr_myfile;
    
        ptr_myfile=fopen("test.bin","wb");
        if (!ptr_myfile)
        {
            printf("Unable to open file!");
            return 1;
        }
    
        fwrite(mystring, strlen(mystring), 1, ptr_myfile);
    
        fclose(ptr_myfile);
    

    注意你可以在string.h中找到strlenstrcat


    编辑:

    要将文件重写为二进制文件,您需要将二进制字符串转换为原始字符串(从文件中读取)。

    你可以使用这个功能:

    char * binarystring_to_string(char* s,int size){
        char * return_str = malloc(size/8+1);
        int i;
        char * end;
    
    
        for(i = 0; i < size/8; i++){
            return_str[i] = bits_to_char(s);
            printf("\n%c",bits_to_char(s));
            s+=8;
        }
        return_str[i] = '\0';
        return return_str;
    }
    

    作品需要用到这个:

    char bits_to_char(char * num){
     unsigned char result = 0;
     int i;
     for ( i = 0; i < 8; ++i )
        result |= (num[i] == '1') << (7 - i);
     return result;
    }
    

    【讨论】:

    • 感谢您的评论。您的方法是否也适用于将二进制序列写入文件?我不是在寻找诸如“hello world”之类的字符串,相反,我想从读取前一个文件创建的二进制字符串创建一个文件。
    • @DavidWilliam 它打印一个字符串。如果写成“Hello World”或“111010010”没关系。您要创建的文件应该是二进制文件还是文本文件? (这与 0101010 打印无关)
    • 好的。但我的问题是:从字符串中,我可以恢复二进制内容吗?考虑一下 PDF、MP3 等文件。不是 txt 文件。
    • @DavidWilliam 我认为您的想法有些混乱。如果你有一个字符串,你可以获得字符串中每个字符的二进制代码!如果在字符串中写入:“01010110”它是一个字符串..不是二进制表示!
    • @DavidWilliam 当您阅读您的文件时,您可以使用我的函数转换为包含前一个字符串的二进制表示的 string !然后就可以写成二进制文件了!
    【解决方案2】:

    这很明显:以相反的方向执行,例如十进制,但使用 2 的幂: 0b10101010 像这样转换为无符号整数: 2^8*1 + 2^7*0 + 2^6*1 + ... + 2^1*1 + 2^0*0。

    【讨论】:

    • 如何将字符串转换为二进制?
    • 问题是:将缓冲区转换为二进制“字符串”(“101110111011...”)作者想将二进制值从文件转换为存储为字符串的二进制表示。问题是如何再次将其转换为二进制:一种 atoi 函数。
    猜你喜欢
    • 2014-02-21
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多