0

Visual Studio C++ で簡単なコンソール アプリケーションを作成しています。.cer拡張子がバイト配列のバイナリファイルを読み込みたいです。

ifstream inFile;
size_t size = 0; 
char* oData = 0;
inFile.open(path, ios::in|ios::binary);

if (inFile.is_open())
{
    size = inFile.tellg();     // get the length of the file
    oData = new char[size+1];  //  for the '\0'
    inFile.read( oData, size );
    oData[size] = '\0' ;       // set '\0'

    inFile.close();
    buff.CryptoContext = (byte*)oData;
    delete[] oData;
}

しかし、起動すると、すべてのoData文字に同じ文字が表示され、毎回別の文字が表示されます。次に例を示します。

oData = "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...".

それから私は別の方法を試しました:

std::ifstream in(path, std::ios::in | std::ios::binary);

if (in)
{
    std::string contents;

    in.seekg(0, std::ios::end);
    contents.resize(in.tellg());

    in.seekg(0, std::ios::beg);
    in.read(&contents[0], contents.size());

    in.close();
}

現在、コンテンツには非常に奇妙な値が含まれています。値の一部は正しく、一部は負で奇妙な値です (おそらくsigned charunsigned char? に関連している可能性があります)。

誰にもアイデアはありますか?

よろしくお願いします!

4

2 に答える 2

1

ポインターでデータを指すように CryptoContext を設定してbyteいます。その後、そのデータを削除します。

buff.CryptoContext = (byte*)oData;
delete[] oData;

この行の後、CryptoContext は解放された無効なデータを指しています。配列をメモリに長く保持oDataし、デコードまたはそれを使って何をしていても、配列を削除してください。

于 2013-03-20T12:00:01.243 に答える
1

最初のバージョンを見る:

tellgストリームのサイズを取得するとどう思いますか? そうではなく、現在の読み取り位置を返します。次に、データへのポインターを指定しbuff.CryptoContents、指定されたデータをすぐに削除します。これは非常に危険な行為です。データをコピーするか、スマート ポインターを使用するか、データの寿命が正しいことを確認する必要があります。デバッグモードで実行している場合、削除がマーカーでデータを踏みつけて、削除されたことを示す可能性があります。これが、同一の文字のストリームを取得している理由です。

署名されたものと署名されていないものについてのあなたの提案は、2番目には正しいかもしれないと思いますが、あなたのファイルとデータを見なければ何とも言えません.

于 2013-03-20T12:00:10.720 に答える