2

このコードで問題が発生しています。QByteArray :: numberはハッシュからQByteArrayを取得し、それを16進数に変換する必要がありますが、結果は予想よりもはるかに短くなります。私は両方の出力が同じであるべきだと思っていました。ポインタキャストと関係があると思いますが、そのキャストがどのように評価されているかを理解するのに十分な成果を上げているのかわかりません。

これらの2つの行が異なる結果を出力する理由を誰かが説明できますか?できれば数学的に。

コード

QCryptographicHash hash(QCryptographicHash::Sha1);
hash.addData("some string to hash");
qDebug() << QByteArray::number(*(qlonglong*)hash.result().data(), 16);
qDebug() << hash.result().toHex();

出力:

"89bde3ca56c83c47" 
"473cc856cae3bd89e43ff9f62963d6f38372ccbd" 

期待される出力:

"473cc856cae3bd89e43ff9f62963d6f38372ccbd" 
"473cc856cae3bd89e43ff9f62963d6f38372ccbd" 

注:私の実際の問題は16進数ではなく36進数にありますが、これをはるかに簡単に表示できるようにするための.toHexメソッドが便利にありました。

4

2 に答える 2

5

あなたのコードhash.result().data()では、160ビット(20バイト)のデータを指します。Aqlonglongは、プラットフォーム上の64ビット(8バイト)のデータです。

*(qlonglong*)hash.result().data()ハッシュ結果の最初の8バイトを数値として再解釈します。プラットフォームはリトルエンディアンのプラットフォームであるため、ハッシュデータの最初のバイトは結果の数値の下位バイトとして解釈されます。

その結果、64ビットの数値(16進数として表示)は、ハッシュデータの最初の8バイトを逆の順序で表示します。あなたはあなたの出力でそれを見ることができます:

89 bd ... 3c 47

の最初の部分の逆です

47 3c ... bd 89    e4 3f ...
于 2013-02-03T00:07:27.577 に答える
-1

string基本的に、 (としてconst char*)をにキャストしlong long*、それを逆参照して、取得した数値を。のコンストラクターに返しますQByteArray。クラスを使用せずqtに、これを行っています。

std::string s = "1b3";
const char* cc = s.c_str();

std::cout<<cc<<std::endl;
std::cout<<*(long long*)cc<<std::endl;

同じ文字列が返されますか?いいえ、しません。

output:
1b3
3367473

これは数学的なことではありません...achar*をaにキャストlong long*し、結果として有効な数値を期待することには問題があります。

于 2013-02-02T23:54:22.917 に答える