我有一个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”。
答案 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];
}