C 如何将十六进制的无符号int[16]转换为无符号字符数组而不丢失任何信息?

C 如何将十六进制的无符号int[16]转换为无符号字符数组而不丢失任何信息?,c,byte,memcpy,C,Byte,Memcpy,我有一个无符号int[16]数组,打印出来时如下所示: 4418703544ED3F688AC208F5343AA59 用于打印的代码如下所示: for (i = 0; i < 16; i++) printf("%X", CipherBlock[i] / 16), printf("%X",CipherBlock[i] % 16); printf("\n"); 这似乎不起作用。出于某种原因,它只将“CipherBlock”的第一个字节复制到“arr”中。此后,“arr”的其余部分是

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

4418703544ED3F688AC208F5343AA59

用于打印的代码如下所示:

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

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

为什么不将
CipherBlock
指针强制转换为
无符号字符*
,然后传递它呢

decrypt((unsigned char *)CipherBlock);

为什么不将
CipherBlock
指针强制转换为
unsigned char*
并传递它呢

decrypt((unsigned char *)CipherBlock);
int
至少是16位,在这方面与
short
相同

在您的示例中,每个
无符号int
的值都是0-255或00-FF,这是
无符号字符的安全范围。但是,将一个转换为另一个的正确方法是强制转换:

for (int i=0; i<16; ++i) arr[i] = (unsigned char) CipherBlock[i];
for(int i=0;i一个
int
至少是16位,在这方面与
short
相同

在您的示例中,每个
无符号int
的值都是0-255或00-FF,这是
无符号字符的安全范围。但是,将一个字符转换为另一个字符的正确方法是强制转换:

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

for(inti=0;i您需要重新打包这些数字,这样您就不能直接使用memcpy或强制转换它。Aib有正确的方法

unsigned char array[16];
for(int i = 0; i < 16; i++) {
    array[i] = CipherBlock[i];
}
无符号字符数组[16];
对于(int i=0;i<16;i++){
数组[i]=CipherBlock[i];
}

您需要重新打包这些数字,这样您就不能直接使用memcpy或强制转换它。Aib有正确的数字

unsigned char array[16];
for(int i = 0; i < 16; i++) {
    array[i] = CipherBlock[i];
}
无符号字符数组[16];
对于(int i=0;i<16;i++){
数组[i]=CipherBlock[i];
}


显然,每个元素只有至少8位
CipherBlock[i]
重要,因此它们不是任意整数(或者它们的24个最高位对您来说无关紧要)。您的
decrypt
函数指定接受任意以零结尾的字符串,还是只能接受十六进制字符串(十六进制数字在ASCII中)?@Basile Starynkevitch:这就是问题所在。我们以
无符号字符*
的形式传递的是什么我认为这个问题没有得到充分的说明。有几种不同的方法可以将16
unsigned int
值转换或重新解释为许多
unsigned char
值,并且无法从问题中判断您想要哪一个。例如,您不说是否想要中的第一个
unsigned char
e> arr
表示第一个
无符号int
的最高有效8位,或最低有效8位,或其他。这取决于首先如何生成密码锁并将其传输给您。根据您的观察,最后一个参数为64的
memcpy
只复制一个字节——在从表面上看,这是不可能的,您遗漏的代码中一定有一些错误。显然,每个元素只有至少8位
CipherBlock[i]
重要,因此它们不是任意整数(或者它们的24个最高位对您不重要)。您的
decrypt
函数指定为接受任意以零结尾的字符串,还是只能接受十六进制字符串(十六进制数字为ASCII)?@Basile Starynkevitch:这就是问题所在。我们以
无符号字符*
的形式传递的是什么?(有关推测,请参阅我的答案。)我认为这个问题没有得到充分的说明。有几种不同的方法可以将16
unsigned int
值转换或重新解释为许多
unsigned char
值,并且无法从问题中判断您想要哪一个。例如,您不说是否想要中的第一个
unsigned char
e> arr
表示第一个
无符号int
的最高有效8位,或最低有效8位,或其他。这取决于首先如何生成密码锁并将其传输给您。根据您的观察,最后一个参数为64的
memcpy
只复制一个字节——在表面上看,这是不可能的,你遗漏的代码中一定有一些bug。什么?不,它表明CipherBlock[i]逐字保存值。编码可能是4字节2的补码小尾端,这意味着值在第一个字节中,其他3个是00或FF。@好的,你是对的。我想移位16而不是除以16(移位4).@aib仍然无法使用memcpy。您的答案是正确的,但我无法投票。抱歉。请注意,每个CipherBlock元素至少打印两个字符。前两个是44,表示CB[0]/16=4和CB[0]%16=4。这将给它值0x44或0x00000044。如果有超过32个字符,这将使至少一个元素>FF并放弃所有赌注。好的。我们偶尔都会因为所有这些位的混乱而放弃:)什么?不,它表示CipherBlock[i]逐字保存值。编码可能是4字节2的补码小尾端,这意味着值在第一个字节中,其他3个是00或FF。@好的,你是对的。我想移位16而不是除以16(移位4).@aib仍然无法使用memcpy。您的答案是正确的,但我无法投票。抱歉。请注意,每个CipherBlock元素至少打印两个字符。前两个是44,表示CB[0]/16=4和CB[0]%16=4。这将给它值0x44或0x00000044。如果有超过32个字符,这将使至少一个元素>FF并放弃所有赌注。好的。我们偶尔都会被所有这些位损坏所抛弃:)正如@James所建议的,这将是错误的,除非
decrypt()
实际上需要一个指向无符号整数数组的指针,并将其转换为指向无符号字符的指针。唯一的解码方法是将指针转换回
无符号int*
(在这种情况下,要求
无符号int*