2016-09-01 4 views
0

コードがuint64_tの上位部分と下位部分のスワップの数学的意味は何ですか?

uint64_t swapE64(uint64_t val) { 
    uint64_t x = val; 
    x = (x & 0xffffffff00000000) >> 32 | (x & 0x00000000ffffffff) << 32; 
    x = (x & 0xffff0000ffff0000) >> 16 | (x & 0x0000ffff0000ffff) << 16; 
    x = (x & 0xff00ff00ff00ff00) >> 8 | (x & 0x00ff00ff00ff00ff) << 8; 
    return x; 
} 

sha256のオープンソースプロジェクトからある機能は複雑ではありませんが、私は、その数学的な手段と使用法を知りません。


私のせいで、私は質問を非常に明確にしませんでした。異なるエンディアン表現を使用する異なる環境では、この関数は同じ意味でデータを保持しますが、同じエンディアン表現では、それはどういう意味ですか?

これは絶対にデータの意味を変えますか、それともそれを交換する他の理由がありますか?ウィキペディアにSHA256ためpseudocode

+0

SHA256のための仕様を読んで、そしてすべてはあなたに明らかであろう。これは、基本的に、int64のエンディアンを交換しています。 –

+0

@SamVarshavchik、私はgithubからsha256の他の実装をいくつか読みましたが、そのような機能はありません。 – Patrick

+2

この質問に対する良い答えは、バイナリで数値を表現する方法を理解しているかどうかを知ることです。また、エンディアンが何を意味するのか知っていますか? – asimes

答えて

3

それは

前処理言う:ビットを追加し、「1」メッセージに追加kは最小の数> = 0ようなものであるkビット「0」、 結果のメッセージ の長さ(512ビットを法とする)は448です。メッセージの長さ(64ビットビッグエンディアン)を (64ビットビッグエンディアン)として付加します( '1'ビットまたはパディング無し)。後処理された全長は512ビットの倍数)

x86/x86_64 LinuxおよびUnixは小エンディアンです。

メッセージの長さをビッグエンディアンに変換してメッセージの末尾に追加します。これはsha256.cのL105のソースで行います。コードのその部分だけがswapE64関数が呼び出されます:

https://github.com/noryb009/sha256/blob/77a185c837417ea3fc502289215738766a8f8046/sha256.c#L100

関連する問題