-1

C++でのバイナリファイルの読み取りに問題があります。現在、私のコードは次のようになっています。

FILE *s=fopen(source, "rb");
fseek(s,0,SEEK_END);
size_file size=ftell(s);
rewind(s);

char *sbuffer=(char *) malloc(sizeof(char) * size);
if(sbuffer==NULL){
    fputs("Memory error", stderr);
    exit(2);
}
size_t result=fread(sbuffer,1,size,s);
if(result != size){
    fputs("Reading error",stderr);
    exit(3);
}
fclose(s);
cout<<sbuffer<<endl;

ただし、端末に出力される文字は、PDFファイルに書き込んだ文字ではなく、すべてランダムな文字です。それらは次のようなものです:

% P D F - 1 . 3 
 % ? ? ? ? ? ? ? ? ? ? ? 
 4   0   o b j 
 < <   / L e n g t h   5   0   R   / F i l t e r   / F l a t e D e c o d e   > > 
 s t r e a m 
 x  ? ? ? j ? 0  E ? ? ? k ?  y Q E # ? ? ? m ? & ? ? @  % + ? .     ? ?  ? ? A i  ?     4 z \ 1 G W ? ?  - , ? ? ? (  ? ? ?  9 ? ? ? ? ?  \ ? } ? ? ? e ? ? ? ? 0 ? ? ? ~ ? , ? ? & 8 ? ? x e 4 ? r 
 | ? ? ? 
          ? ? ? ? E  > a ? ? z & ? Z ? < ?  }  '  ? ? ? j p ? ? Q 7 0 ? ? ? S %  - p ? ? ? 7 D  ?  ? ? ' Q z Q ?  ? ? ? ? ? ? ? ? ? \ 2 ? ? 7 ? ? ? < ? ? D ~  ? ? ? 

 e n d s t r e a m 
 e n d o b j 
 5   0   o b j 
 2 2 8 
 e n d o b j 
 2   0   o b j

そして、上記のような他の多くのキャラクター。長い間検索してみましたが、実際の文字を取り出して後処理する方法がわかりません。ちなみに、バイナリファイルを入出力とするコンプレッサーを書こうとしています。ここでの助けは大歓迎です!

4

2 に答える 2

6

プレーンな未加工の .TXT テキスト ファイルなど、直接「読み取って」「理解」できるファイル形式はごくわずかです。ほぼすべてのバイナリ形式を含むほとんどのファイル形式は ..形式です。これは、ファイル内に保持されている特定の構造を意味します。完全に構造のない .TXT テキスト ファイルとは正反対というか、純粋なデータの 1 つの巨大なブロックです。

ワードパッド、Word、またはその他のあまりインテリジェントでないテキスト エディターを開き、そこにテキストを書き込んでから、RTF、DOC、ODT、またはその他の非 TXT ファイルとして保存します。次に、TXTファイルとしても保存します。

HEX VIEWER/HEX EDITORをダウンロードしてください。どれでも。1 つの列に生のバイナリ値を表示し、もう 1 つの列に ASCII テキストを表示するだけで、多くの機能は必要ありません。ほとんどすべての無料の 16 進ビューアー/エディターでこれを行うことができます。

これら 2 つのファイルを開いて比較します。すぐに違いがわかります。

PDF に戻る:

PDF には、テキストにインターリーブされたグラフィックを含めることもできます。テキストが TXT のように「ファイルにただ座っている」場合、どのようにそれを保持すると思いますか? 画像の位置/説明/データはどのように埋め込まれますか? 私がよく覚えている限り、PDF には JavaScript に似たスクリプトを含めることさえできます。実行可能。PDF タイプのドキュメントでは、何かを実行するボタンを使用できます。これは、ファイル内のテキストよりもはるかに複雑です。

通常、バイナリ ファイルには、目に見える平易なテキストは含まれていません。テキストはブロックで構造化され、色、テキスト レイアウト、ページングなどに関するメタデータでラップされています。さらには、ドキュメントのバージョン管理、オーサリング、分類などに関する特別な構造 (...) もあります。これはすべてどこかに保管する必要があります。

通常、バイナリ ファイルにはセクションがあります。通常、最初のセクションは HEADER と呼ばれます。内部には、フォーマットの種類、フォーマットのバージョン、ファイル/ブロック/データの長さ、画像の解像度などに関する情報があります。これらはおそらくすべてバイナリ形式で保持されます。「800x600」テキストはなく、「|00|00|03|20|00|00|02|58|」のみです。32ビットBEを想定。説明を読み、デコードして理解すると、実際のデータがどこから始まるか、データ ブロックがどのように配置されているか、それらをデコードして内容を理解する方法がわかります。

編集:

テキスト ファイルとバイナリ ファイルの違いを理解したら、http://en.wikipedia.org/wiki/Entropy_(information_theory)で絶対的な基本事項を確認してください。次に、RLE ( http://www.daniweb.com/software-development/cpp/code/216388/basic-rle-file-compression-routine ) または Huffman ( http://www.cprogramming.com/tutorial )で遊んでみてください。 /computersciencetheory/huffman.html ) 比較的簡単なことから始めてください。次に、ハフマン コードについてさらに読み始めると、ZIP や LZH などのタスクに十分に備えることができます。

于 2013-02-23T16:56:40.253 に答える
3

PDF をテキストとして解析するには、 gnupdfpopplerなどの PDF ライブラリを使用します。

于 2013-02-23T16:58:29.513 に答える