0

我有一个 unsigned int[16] 数组,打印出来时看起来像这样:

4418703544ED3F688AC208F53343AA59

用于打印出来的代码是这样的:

for (i = 0; i < 16; i++)
    printf("%X", CipherBlock[i] / 16), printf("%X",CipherBlock[i] % 16);
printf("\n");

我需要将这个无符号整数数组“CipherBlock”传递给只接受无符号字符 * 的解密()方法。如何正确地将“CipherBlock”数组中的所有内容存储到无符号字符数组中而不会丢失信息?

我的理解是 unsigned int 是 4 个字节, unsigned char 是 1 个字节。由于“CipherBlock”是 16 个无符号整数,因此以字节为单位的总大小 = 16 * 4 = 64 字节。这是否意味着我的 unsigned char[] 数组长度必须为 64?

如果是这样,以下工作是否可行?

unsigned char arr[64] = { '\0' };
memcpy(arr,CipherBlock,64); 

这似乎不起作用。由于某种原因,它只将“CipherBlock”的第一个字节复制到“arr”中。此后“arr”的其余部分为“\0”。

4

3 回答 3

2

为什么不直接将CipherBlock指针投射到unsigned char *并传递它?

decrypt((unsigned char *)CipherBlock);
于 2012-09-09T21:02:22.703 回答
2

An至少为int16位,在这方面与 a 相同。short

在您的情况下,看起来每个unsigned int都有值 0-255 或 00-FF,这是unsigned char. 但是,将一个转换为另一个的正确方法是强制转换:

for (int i=0; i<16; ++i) arr[i] = (unsigned char) CipherBlock[i];

但是您还没有指定decrypt()期望什么样的数据。从签名中,我怀疑整数数据(字符串通常是char*or const char*)但是如果没有上下文就很难确定。

请注意,您也可以printf("%02X", CipherBlock[i]);进行打印。

于 2012-09-09T21:14:02.087 回答
1

您需要重新打包数字,这样您就不能使用 memcpy 或直接转换它。Aib 说得对。

unsigned char array[16];
for(int i = 0; i < 16; i++) {
    array[i] = CipherBlock[i];
}
于 2012-09-09T21:14:50.180 回答