我一直试图解析它们几天,我不能完全理解它。他们在这里:
int left = S->buflen >> 3;
int fill = 64 - left;
if(left && (((datalen >> 3) & 0x3F) >= (unsigned)fill)){
some code here
}
如果有帮助,这是SHA-3候选BLAKE256的参考实现。
答案 0 :(得分:6)
没有bitops的替代方案可能有助于澄清意义:
int left = S->buflen / 8;
int fill = 64 - left;
if (left != 0) {
int tmp = datalen / 8;
if ((tmp % 64) >= (unsigned)fill) {
/* Some code here */
}
}
这当然假设buflen
和datalen
是非负的,因为右移运算符对负数具有平台相关行为。
答案 1 :(得分:1)
int left = S->buflen >> 3;
获取剩余的字节数,假设buflen
是以位为单位的度量值。
int fill = 64 - left;
获取您需要附加的字节数,以便将其舍入为64的倍数。请注意,如果S->buflen
为0,则在不需要时最终会附加整个64字节追加任何,所以......
if(left && (((datalen >> 3) & 0x3F) >= (unsigned)fill)){
some code here
}
...只有当剩下一些位且datalen
从位转换为字节时才执行一些代码,mod 64至少等于你需要写入的额外字节数。大概是因为datalen
是最大输出大小?