代码来自一个开放源码项目,
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;
}
这个函数并不复杂,但我不知道它的数学方法和用法。
我的错,我问得不太清楚。在不同的环境中使用不同的endian表示,很明显,这个函数将保持数据的相同含义,但是在相同的endian表示下,它意味着什么?
它绝对会改变数据的含义,还是有其他原因来交换它?
最佳答案
在维基百科上SHA256的pseudocode里
预处理:将位“1”追加到消息append k bits“0”,
其中,k是最小值>=0,这样生成的消息
长度(模数512位)是448。以位为单位追加消息长度(不带“1”位或填充),作为64位大端
整数
(这将使整个后处理长度为512位的倍数)
x86/x86_64Linux和Unix是小端。
它将消息的长度转换为big endian以将其添加到消息的末尾,这是它在sha256.c的L105源代码中所做的,并且该段代码是调用swapE64
函数的唯一位置:
https://github.com/noryb009/sha256/blob/77a185c837417ea3fc502289215738766a8f8046/sha256.c#L100
关于c - 交换uint64_t的高位部分和低位部分的数学含义是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39261680/