2

これは私の最初の投稿なので、不文律を破っていたら申し訳ありません。:PI は初心者/中級のプログラマーで、このプログラムについて助けが必要です。

.dat ファイルを HEX として 1 つの大きな文字列に infile/read/ifstream (何でも) しようとしています。

テキストとして読みたくない。文字列を検索して変更できるように、16 進形式が必要です。(自動 16 進エディタのように)

元。私のファイル「00000000.dat」のサイズは〜7kbです。

16 進エディタでは、16 進は次のようになります。

0A 00 00 0A 00 05 4C 65 76 65 6C 07 00 06 42 6C 6F 63 6B 73 00 00 80 00 07 FF 39
01 FF 03 03 02 FF 3F 00 07 FF 39 01 FF 03 03 02 FF 3F 00 07 FF 39 01 FF 03 03 02
FF 3F 00 07 FF 39 01 FF 03 03 02 FF 3F 00 07 FF 39 01 FF 03 03 02 FF 3F 00 07 FF
39 01 FF 03 03 02 FF 3F 00 07 FF 39 01 FF 03 03 02 FF 3F 00 07 FF 39 01 FF 03 03
02 FF 3F 00..... for a while...

文字列変数にすべてが必要です(できればスペースを入れないでください)。

私の現在のコードはひどいもので、今のところ結果を出力するだけです。(ehowから入手)入力/印刷したいものを選んで選択しているようです。

#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <fstream>

using namespace std;

int main()
{
    ifstream input;
    input.open("00000000.dat");

    unsigned char h1,h2;

    do
    {
        input >> h1;
        cout << hex << (unsigned int)h1;
        input >> h2;
        cout << hex << (unsigned int)h2;
    }while(!input.eof());

cin.get();
return 0;
}

これは大きなファイルなので、何を出力するかはお見せできませんが、いくつかのバイトが欠落しています。(例: "0A 00 00 0A 00 05....." は "00 05....." と出力されます) これはエンディングにも当てはまります。

うまく説明できなくてすみません(;_;)

4

2 に答える 2

8

前述のように、ストリームをバイナリとして開く必要があります。>>空白をスキップしないように指示する場合は、通常の演算子を使用できます。

unsigned char x;
std::ifstream input("00000000.dat", std::ios::binary);
input >> std::noskipws;
while (input >> x) {
    std::cout << std::hex << std::setw(2) << std::setfill('0')
              << (int)x;
}

コンテンツを文字列にするには、 のostringstream代わりに を使用できますcout

于 2013-05-07T03:29:25.610 に答える