繁体   English   中英

二进制添加大字符数组?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM