代码来自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;
}
功能并不复杂,但我不知道它的数学手段和用法。
我的错,我确实没问过这个问题。在使用不同字节表示的不同环境中,很明显,此函数将使数据保持相同的含义,但在相同的字节表示下,它意味着什么?
它绝对会改变数据的含义,还是有其他原因要交换它?
答案 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