如何复制文件的二进制数据

时间:2016-05-27 21:49:22

标签: c++ c binary

基本上,我试图通过使用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),我将非常感激。

3 个答案:

答案 0 :(得分:3)

 while(sizeForB = fread(ForBinary, 1, BUFSIZ, ReadBFrom)){             
           printf("%s", ForBinary);  }

这在许多层面都是错误的。首先你说它是二进制文件 - 这意味着它首先可能没有文本,你使用%s格式说明符,用于打印空终止字符串。同样,因为这是二进制文件,并且首先可能没有文本,%s是要使用的错误格式说明符。即使此文件中有文本,您也不确定fread是否会读取“完整”的空终止字符串,您可以使用格式说明符printf传递给%s

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

基本上是伪代码:

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

答案 1 :(得分:1)

How to view files in binary in the terminal?

无论

  

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

  

xxd -b file

答案 2 :(得分:1)

要简单地读取文件并以二进制(1和0)打印,请一次读取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);
}