2016-05-27 5 views
-1

В принципе, я пытаюсь читать двоичные данные файла с помощью 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

Открытие файла в «двоичном режиме» означает, что при чтении из него вы получите необработанные данные без специальной обработки. Если вы выведете его, он будет выводиться как есть, что будет выглядеть как мусор. Если вы хотите, чтобы он выводился как 0 и 1, вам нужно написать код для этого. – kfsone

+2

@Wajid Вы правильно читаете это как бинарный файл. Проблема в том, что в C/C++ нет двоичного примитивного типа данных, поэтому он обычно хранится как символы (8 бит на символ). Вы говорите, что среда выполнения должна печатать эти двоичные данные, как если бы это была строка, поэтому вы получаете символы, потому что это просто строковое представление двоичных данных, которые вы печатаете. См. Это: [Преобразование двоичных файлов в строку] (/ questions/2343099/convert-binary-format-string-to-int-in-c) – Tibrogargan

+0

Если вы хотите, чтобы работа была выполнена правильно, вы должны сделать это самостоятельно. 'printf' не имеет спецификатора преобразования, который выводится в двоичном формате.Таким образом, вам нужно написать вложенный цикл, в котором внешний цикл получает символ из буфера, а внутренний цикл преобразует символ и выводит его как двоичный. – user3386109

ответ

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

Это неверно на многих уровнях. Прежде всего вы сказали, что это двоичный файл, что означает, что в нем, возможно, не будет текста, и вы используете спецификатор формата %s, который используется для печати строк с нулевым завершением. Опять же, поскольку это двоичный файл, и, возможно, в нем нет текста, %s - неправильный спецификатор формата. И даже если в этом файле есть текст, вы не уверены, что fread будет читать «полную» строку с нулевым завершением, которую вы могли бы передать printf с спецификатором формата %s.

Что вы можете сделать, это прочитать каждый байт, сформировать файл, преобразовать его в двоичное представление (Google, как преобразовать целое число в двоичную строку, например, here) и напечатать двоичное представление для каждого этого байта.

В основном псевдокод:

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

How to view files in binary in the terminal?

Либо

"шестнадцатеричного -C yourfile.bin" может быть, если вы не хотите, чтобы изменить его, конечно. Большинство дистрибутивов linux по умолчанию имеют hexdump (но, очевидно, не все).

или

XXD -b файл

1

Чтобы просто прочитать файл и распечатать его в двоичном (единиц и нулей), прочитал один 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); 
} 
+0

ваше решение кажется просто идеальным, оно печатает его в 1 и 0, теперь, если я хочу захватить эти двоичные числа и поместить их в txt-файл в виде текста и прочитать его с помощью fread() из этого файла, тогда напишите как двоичные данные нового файла, он будет работать. и большое спасибо за вашу помощь – Wajid

Смежные вопросы