代码来自一个开放源码项目,

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/

10-11 01:22