2011-12-08 14 views
0

私は非常に単純な暗号化プログラムを書いてC++を実践しました。私はこの奇妙な振る舞いを見つけました。文字列を配列と同じに設定することでchar *配列を文字列に変換すると、間違った文字列が返されますが、空の文字列を作成して文字列を個別に追加すると、正しい文字列が作成されます。誰かがなぜこれが起こっているのか説明してもらえますか、私は先週C++でプログラミングを始めました。なぜこれが動作しないのか分かりません。なぜ2つの異なる文字列が得られますか?

はところで私は、オンラインでチェックし、これらは明らかに文字列に文字列を変換するの両方の有効な方法です。

void expandPassword(string* pass) 
{ 
    int pHash = hashCode(pass); 
    int pLen = pass->size(); 
    char* expPass = new char[264]; 
    for (int i = 0; i < 264; i++) 
    { 
     expPass[i] = (*pass)[i % pLen] * (char) rand(); 
    } 
    string str; 
    for (int i = 0; i < 264; i++) 
    { 
     str += expPass[i];// This creates the string version correctly 
    } 

    string str2 = expPass;// This creates much shorter string 
    cout <<str<<"\n--------------\n"<<str2<<"\n---------------\n"; 

    delete[] expPass; 
} 

編集:私は、配列からの零点のすべてを削除し、それは何も変更していない

+11

あなたのエンコードされた文字列は、ゼロが含まれています。 –

+0

「間違った文字列」はどういう意味ですか?結果の文字列が最初の文字列の最初の '\ 0'文字で終わることを除いて、結果の文字列は最初の文字列と同じであることを意味しますか? –

答えて

0

::はstdするのchar *からコピーした文字列、代入演算子は停止します。これは埋め込まれたNULL文字を引き起こしている "暗号化"の問題を指しています。

これは、符号化は暗号化されたデータと共に使用される主な理由の一つです。暗号化の後、結果のデータはHex/base16またはbase64アルゴリズムを使用してエンコードする必要があります。

+0

ありがとう、私は誰もが0を無視すると言っていました。暗号化ではなく、鍵の拡張であることを意味します。 –

+0

エンコードを開始するには、16進数または16進数のエンコードが最適です(http://en.wikipedia.org/wiki/Hexadecimal ) – jveazey

0

\ 0(ゼロ)で終わる一連の文字が何であるかをあなたが構築されているようなC-文字列アスキー値。

式が0と評価された場合

expPass[i] = (*pass)[i % pLen] * (char) rand(); 

の場合、あなたは配列に\ 0を挿入することができるだけでなく、あなたは確実にするために、いずれかの文字列の末尾に\ 0を付加しません。これは有効なC文字列です。あなたは

string str2 = expPass; 

を行う際

はそれが非常によく、それが切り捨てられますので、それが文字列のどこかに\ 0を発見したとき、文字列が短くなることもできます。それは最初のNULL文字に到達したときに

0

Cスタイルの文字列としてstr2 = expPass解釈はexpPass、ゼロ値(「NULL」)バイト'\0'は、文字列の終わりを示すことを意味するからです。したがって、たとえば、この:

char p[2]; 
p[0] = 'a'; 
p[1] = '\0'; 
std::string s = p; 

pがが'\0'を終了する前に一つだけの非ゼロバイトを持っているためsは、長さ1を持つことになります。しかし、この:それは明示的sに両方のバイトを追加するため

char p[2]; 
p[0] = 'a'; 
p[1] = '\0'; 
std::string s; 
s += p[0]; 
s += p[1]; 

、長さ2を持つようにsが発生します。 (std::string、それはそれを利用するために常に良い考えではありませんけれども、Cスタイルの文字列とは異なり、実際のヌルバイト—を含めることができます。)

0

私は次の行は、あなたの文字列をカット推測:

expPass[i] = (*pass)[i % pLen] * (char) rand(); 

rand()が0を返すと、位置iに文字列ターミネータが返されます。

関連する問題