c - 如何在不丢失任何信息的情况下将十六进制的 unsigned int[16] 转换为 unsigned char 数组?

标签 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”数组中的所有内容 memcpy 到 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'。

最佳答案

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]); 进行打印。

关于c - 如何在不丢失任何信息的情况下将十六进制的 unsigned int[16] 转换为 unsigned char 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12342890/

相关文章:

Java字节数据类型

c - 如何使用C语言程序通过计算机的usb端口打开/关闭电灯泡

常量和指向指针的指针

c - C 中的退出函数

c++ - 为什么 memcpy 不在导入表中?

c++ - 读取大型 txt 文件时在结构内动态分配 vector

c++ - 如何将 unsigned int 放入 char 数组并将其提取回来

c - 8 字节 double 作为 uint64_t 的二进制字符串

arrays - 如何使用带有两个 []byte slice 或数组的 Go append?

python - 在 Python 中构建一个位串