如何将十六进制的unsigned int [16]转换为unsigned char数组而不丢失任何信息?

时间:2012-09-09 20:52:22

标签: c byte memcpy

我有一个unsigned int [16]数组,打印出来时如下所示:

4418703544ED3F688AC208F53343AA59

用于打印出来的代码是:

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

我需要将这个unsigned int数组“CipherBlock”传递给一个只接受unsigned char *的decrypt()方法。如何正确地将“CipherBlock”数组中的所有内容存储到unsigned char数组中而不丢失信息?

我的理解是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”。

3 个答案:

答案 0 :(得分:2)

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

decrypt((unsigned char *)CipherBlock);

答案 1 :(得分:2)

int 至少 16位,在这方面与short相同。

在您的情况下,似乎每个unsigned int的值都为0-255或00-FF,这是unsigned char的安全范围。但是,将一个转换为另一个的正确方法是强制转换:

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

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

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

答案 2 :(得分:1)

您需要重新打包数字,这样您就无法使用memcpy或直接投射它。 Aib说得对。

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