【问题标题】:how to copy binary data of a file如何复制文件的二进制数据
【发布时间】:2016-09-26 08:09:37
【问题描述】:

基本上,我正在尝试使用 fread() 读取文件的二进制数据并使用 printf() 将其打印在屏幕上,现在,问题是当它打印出来时,它实际上并没有显示为二进制 1 和 0,但打印符号和我不知道它们是什么的东西。

这就是我的做法:

#include <stdio.h>
#include <windows.h>


int main(){
    size_t  sizeForB, sizeForT;
    char    ForBinary[BUFSIZ], ForText[BUFSIZ];

    char    RFB []      = "C:\\users\\(Unknown)\\Desktop\\hi.mp4"   ;       // Step 1

    FILE    *ReadBFrom  = fopen(RFB , "rb" );

    if(ReadBFrom == NULL){
        printf("Following File were Not found: %s", RFB);
        return -1;
    } else {
        printf("Following File were found: %s\n", RFB);                              // Step 2
        while(sizeForB = fread(ForBinary, 1, BUFSIZ, ReadBFrom)){                      // Step 1
           printf("%s", ForBinary);
        }
        fclose(ReadBFrom);

    }

    return 0;
}

如果有人能帮助我将文件的实际二进制数据读取为二进制 (0,1),我将不胜感激。

【问题讨论】:

  • 以“二进制模式”打开文件只是意味着当您从中读取时,您将获得未经特殊处理的原始数据。如果你输出它,它会按原样输出,看起来像垃圾。如果您希望它输出为 0 和 1,则需要编写一些代码来执行此操作。
  • @Wajid 您正在正确地将其读取为二进制文件。问题是 C/C++ 中没有二进制原始数据类型,因此它通常存储为字符(每个字符 8 位)。您告诉运行时打印二进制数据,就好像它是一个字符串一样,所以您得到了符号,因为这恰好是您正在打印的二进制数据的字符串表示形式。看到这个:Convert binary to string
  • 如果你想把工作做好,你必须自己做。 printf 没有以二进制输出的转换说明符。所以你必须编写一个嵌套循环,其中外循环从缓冲区中获取一个字符,内循环转换字符并将其输出为二进制。
  • 您不是在尝试编写二进制文件。您对printf 的说明符表示您正在向它传递一个字符串,但事实并非如此。当您告诉它您正在传递一件事然后传递完全不同的内容时,如果事情没有按预期进行,请不要感到惊讶。 Printf 无法提前判断您所传递的内容是不同的。它必须信任您作为开发者才能真正传递您说过要传递的内容,而您并没有诚实传递该内容。
  • 您想要一个好的 C 或 C++ 答案吗?

标签: c++ c binary


【解决方案1】:
 while(sizeForB = fread(ForBinary, 1, BUFSIZ, ReadBFrom)){             
           printf("%s", ForBinary);  }

这在很多层面上都是错误的。首先,您说它是二进制文件 - 这意味着其中可能首先没有文本,并且您正在使用 %s 格式说明符,它用于打印以空字符结尾的字符串。同样,由于这是二进制文件,而且其中可能没有文本,%s 是使用错误的格式说明符。即使此文件中有文本,您也不确定fread 是否会读取一个“完整的”以空结尾的字符串,您可以使用格式说明符%s 将其传递给printf

您可能想要做的是,从文件中读取每个字节,将其转换为二进制表示(谷歌如何将整数转换为二进制字符串,例如,here),然后打印每个字节的二进制表示.

基本上是伪代码:

foreach (byte b in FileContents)
{
  string s = convertToBinary(b);
  println(s);
}

【讨论】:

    【解决方案2】:

    How to view files in binary in the terminal?

    要么

    "hexdump -C yourfile.bin" 也许,除非你当然想编辑它。大多数 linux 发行版默认都有 hexdump(但显然不是全部)。

    xxd -b 文件

    【讨论】:

      【解决方案3】:

      要简单地读取文件并以二进制(一和零)打印,请一次读取一个char。然后对于每一位,打印一个'0''1'。可以先打印最高或最低有效位。建议 MSb。

      if (ReadBFrom) {
        int ch;
        while ((ch = fgetc(ReadBFrom)) != EOF) {
          unsigned mask = 1u << (CHAR_BIT - 1);  // CHAR_BIT is typically 8
          while (mask) {
             putchar(mask & ch ? '1' : '0');
             mask >>= 1;
          }
        }
        fclose(ReadBFrom);
      }
      

      【讨论】:

      • 您的解决方案似乎工作得非常完美,它确实以 1 和 0 打印它,现在如果我想获取这些二进制数并将其作为文本放入 txt 文件并使用 fread 读回() 从该文件中写入,然后将其写入新文件的二进制数据是否可以正常工作。非常感谢您的帮助
      猜你喜欢
      • 2019-06-18
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多