交换高部分和uint64_t低部分的数学含义是什么?

时间:2016-09-01 02:11:25

标签: c hash bit-manipulation sha256

代码来自sha256

的开源项目
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;
}

功能并不复杂,但我不知道它的数学手段和用法。

我的错,我确实没问过这个问题。在使用不同字节表示的不同环境中,很明显,此函数将使数据保持相同的含义,但在相同的字节表示下,它意味着什么?

它绝对会改变数据的含义,还是有其他原因要交换它?

1 个答案:

答案 0 :(得分:3)

在维基百科上的SHA256的pseudocode中,它说

  

预处理:附加位&#39; 1&#39;消息附加k位&#39; 0&#39;,   其中k是最小数&gt; = 0,使得得到的消息       length(以512为单位的模数)是448. 追加消息的长度(没有&#39; 1&#39;位或填充),以位为单位,作为64位大端   整数       (这将使整个后处理长度为512位的倍数)

x86 / x86_64 Linux和Unix是小端。

它将消息的长度转换为big endian以将其添加到消息的末尾,它在sha256.c的L105的源代码中执行,并且代码的该部分是唯一的位置调用swapE64函数的地方:

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