c - 如何在 C 中读取文件,将二进制缓冲区转换为二进制字符串,然后再次将二进制字符串转换为二进制缓冲区?

标签 c string file binary

我想编写一个可以读取文件的程序,比如说 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....”。

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

谢谢。

最佳答案

也许你需要这样的东西:

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

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

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

关于c - 如何在 C 中读取文件,将二进制缓冲区转换为二进制字符串,然后再次将二进制字符串转换为二进制缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37329063/

相关文章:

c - 如何在C中扫描txt文件中的数据并将其存储在数组中?

c - 如何向队列中添加元素

c - MPFR、printf、小数位、语言环境、文件 i/o 问题

string - Bash cUrl 响应转换为字符串 - 在字符串比较中与 'identical' 字符串不匹配

python - 使用字典列表中的特定值创建列表(键是字符串,值是整数列表)

javascript - Windows 运行时 Javascript 应用程序 - 启动 Javascript 文件

c - 查找二维圆锥形状的网格点

c - C 中链表上​​的双指针

c++ - MySQL C++ 连接器获取带有 SELECT 查询的字符串

java - 尝试写入文件时出现 FileNotFound 异常