将 unsigned long 的每个字节转换为 unsigned char 数组的元素

标签 c char type-conversion long-integer unsigned

如果我有这个unsigned long x (4 个字节),我如何转换 x 的每个字节以其十六进制等效形式并将它们全部存储在数组中:unsigned char[4]

更新

根据我得到的建议,我尝试了这两种解决方案:

解决方案1:

  unsigned char hex_str[9];
  snprintf(hex_str, sizeof(hex_str), "%lX", target_hexstr);
  printf("hex_str: %s\n", hex_str);
  printf("size: %lu\n", sizeof(hex_str));
  for(int x=0; x<sizeof(hex_str); x++)
    printf("%x\n", hex_str[x]);

在本例中,hex_str显示1400和 9 个“单位”:31、34、30、30、0、0、0、0、24。

解决方案2:

  hexstr[0] = (x & 0xFF000000) >> 24;
  printf("%x\n", x[0]);
  hexstr[1] = (hexstr & 0x00FF0000) >> 16;
  printf("%x\n", x[1]);
  hexstr[2] = (hexstr & 0x0000FF00) >> 8;
  printf("%x\n", x[2]);
  hexstr[3] = (hexstr & 0x000000FF);
  printf("%x\n", x[3]);
  printf("hex_str: %s\n", hex_str);

在本例中,hex_str不显示任何内容和 4 个“单位”:0、0、14、0。

为什么这两种解决方案有不同的结果?

最佳答案

因为我喜欢按位运算,我会告诉你我会做什么。但@BLUEPIXY 的解决方案要优雅得多。

我们需要

  • & 按位与
  • >> 按位右移

这是一个简单的解决方案,我们期望 UL4B

unsigned long x = 42;
unsigned char uc[4];

uc[0] = (x & 0x000000FF);
uc[1] = (x & 0x0000FF00) >> 8;
uc[2] = (x & 0x00FF0000) >> 16;
uc[3] = (x & 0xFF000000) >> 24;

printf("uc[0] = %x \n", uc[0]);
printf("uc[1] = %x \n", uc[1]);
printf("uc[2] = %x \n", uc[2]);
printf("uc[3] = %x \n", uc[3]);

关于将 unsigned long 的每个字节转换为 unsigned char 数组的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45908186/

相关文章:

java - 将 double 转换为二进制表示?

matlab - 如何将二进制值列表转换为int32类型?

c - wait() 等待子进程崩溃

c - 断点如何在嵌入式设备上工作?

c - 如何用 C 语言从字符串中解析 IP 地址?

c - 在 C 中同时使用两个函数实现 fread、fopen 和 fwrite 会导致错误吗?

C : Process keeps exiting before being able to input anything

c++ - Caesar Cipher C++(使用字符指针和移位作为参数)

c - C 中的符号扩展,char>unsigned char

python - 将数组的字符串表示形式转换为 python 中的实际数组