从二进制识别文件格式 (C++)

Recognizing file formats from binary (C++)

我是初学者 C++ 程序员。

我编写了一个简单的程序来创建一个字符数组(大小由用户选择)并读取其中的先前信息。通常你可以找到一些有意义的东西(我总能找到字母表?)但其中大部分只是奇怪的字符。我把它输出成一个二进制文件。

但是,我该如何:

  1. 识别不同的数据块

  2. 识别什么块是什么文件格式(即什么块是图像、音频、文本等)

我的代码:

// main.cpp
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main() {
    int memory_size  = 4000;
    string data = "";
    bool inFile = false;

    cout << "How many bytes do you want to retrieve? (-1 to exit)\n";
    cin >> memory_size;

    string y_n;
    cout << "Would you like to write output into a file? (Y/N)\n";
    cin >> y_n;
    if (y_n.compare("Y") == 0 || y_n.compare("y") == 0)
        inFile = true;
    else
        inFile = false;

    char memory_chunk[memory_size];


    for (int i=0;i<memory_size;i++) {
        cout << memory_chunk[i] << "";
        data += memory_chunk[i] + "";
    }



    if (inFile) {
        ofstream file("output.binary", ios::out | ios::binary);
        file.write(memory_chunk, sizeof memory_chunk);  
        file.close();
    }   

    cin >> data;

    return 0;
}

检索数据的示例:(这比它通常可以检索的要小很多)

   dû(       L)         àýtú( ¯1Œw ÐýDú( @ú( Lú(     dû( ¼û(        L)         º
                        ‰v8û(    7Œw           û(  ú( 0ý(     k7Œwdû( @                                                   5 À        ü( ¨›w    ó˜wÞ¯  › Ø›     0ý(     Hû(     À ›     `›   À  Dû( LŒw  › @›     `›       › lû( ÷Œw  ›  › ˜›   › û( 3YŒw  ›     ~Œw ›            €›   › à›     Dü(      › €› Dü( ßWŒwXŒwDÞ¯ ›   ›        €› ˆ› À › ¦›   ›  !› :   À › `›      À  ü(      › ˆ› V   €› 
          Œw   ˆ›           ¬û(     Äÿ( ‘Q‡w€ôçþÿÿÿXŒwµTŒw      ‚› xü(       È6‹w  ›        À×F           fÍñt"ãŠvEA @ÒF    ¸ü( 
                      þÿÿÿ@ÒF Ã~“v           Øü( O¯‰vØÞ¯øü( œ›‰v  ›                   ˆý( ‡ÌE    @ÒF 
      8|“v ý(   ‰v@M“v,ý( wî‰v   hý( ¬_‘v8|“v˜_‘vݧY‘   ÀwF    
   <ý(     Äÿ( e‹vàçþÿÿÿ˜_‘v"A 
   8|“v@ÒF        ÀwF    ïÀE           ÕF        ”› ÓºA ”› ÕF    lF €F  F 2    àýàý( ð      @ 

有些文件格式以有助于识别它们的幻数开头,但情况并非总是如此。维基百科在这里有一些: http://en.wikipedia.org/wiki/List_of_file_signatures。 unix 命令 'file' 尝试根据数据中的幻数猜测文件格式。源代码很可能在某处可用。 (如果没有其他地方,请使用 apple darwin 来源)。