所以我有一个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声明错了。答案 0 :(得分:1)
您的C版本是否具有原生128位数int128
?否则也许尝试从两个int64
s中制作128位块。这将大大减少携带问题。
答案 1 :(得分:1)
一般情况下,您可以通过跟踪进位来自行实施添加。
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} */
答案 2 :(得分:0)
C对大于(大多数)微处理器上的机器寄存器的数据类型没有内在支持。
虽然128位变得“接近”,但它仍然不是普遍支持的类型。因此,最好的办法是使用现有的“bignum”库,或者编写自己的代码。
如果只需要增加它,那自己就不太难了。对于这种特殊情况,您可以使用uint64_t
中的一对<stdint.h>
。
答案 3 :(得分:0)
如果您认为SOME_BIG_NUMBER
足够小以适应uint64_t
,并且您的系统是小端(几乎可以肯定),那么您可以这样做:
*(uint64_t *)&CBlock += 1;
或
*(uint64_t *)&CBlock = i;