[英]Binary Adding Large Char arrays?
所以我有一个16个字符的数组,定义如下。
char CBlock[16];
在我的程序中,我正在实现CTR模式加密(不是很重要,只是说),并且CBlock被初始化为随机的128位十六进制值。 我的程序需要做的是在遍历执行加密的消息块的同时,将该块增加1倍。 即
for (i = 0; i < SOME_BIG_NUMBER; i++){
CBlock = CBlock + 1; /*i know this isn't legal*/
/*do some stuff*/
}
有没有简单的方法可以进行此添加? 有没有一种方法可以将CBlock视为一个连续的数据块? 还是我必须手动执行进位等的二进制(十六进制)加法运算。
编辑:抱歉,CBlock声明错误。
您的C版本是否具有本地128位数字int128
? 否则,请尝试从两个int64
128位块。 这将在很大程度上减少进位问题。
通常,您可以通过跟踪进位来自己实现加法。
unsigned char CBlock[16]; /* unsigned char is assumed to be at least an 8 bit type. */
/* Increment CBlock by 1. */
int carry = 1;
int i;
for (i=0; i<16; i++) {
int sum = CBlock[i] + carry;
CBlock[i] = (unsigned char) (sum & 0xff);
carry = sum >> 8;
if (carry == 0) {
break;
}
}
/* if (carry > 0) { we have overflowed} */
C对大于(大多数)微处理器上的机器寄存器的数据类型没有固有的支持。
虽然128位正在“关闭”,但仍不是普遍支持的类型。 因此,最好的选择是使用现有的“ bignum”库或编写自己的代码。
如果您只需要增加它,那么自己做起来并不难。 对于这种特殊情况,您可能只需要使用一对来自<stdint.h>
的uint64_t
。
如果您可以假设SOME_BIG_NUMBER
足够小以适合uint64_t
,并且您的系统是小端序的(几乎可以肯定是),那么您可以这样做:
*(uint64_t *)&CBlock += 1;
要么
*(uint64_t *)&CBlock = i;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.