【问题标题】:Convert each byte of an unsigned long to an element of an unsigned char array将 unsigned long 的每个字节转换为 unsigned char 数组的元素
【发布时间】:2018-02-05 02:02:36
【问题描述】:

如果我有这个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。

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

【问题讨论】:

    标签: c char type-conversion long-integer unsigned


    【解决方案1】:

    因为我喜欢按位运算,所以我会告诉你我会做什么。但是@BLUEPIXY 的解决方案更加优雅。

    我们需要

    • &amp;按位与
    • &gt;&gt;按位右移

    这是一个简单的解决方案,我们期望 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]);
    

    【讨论】:

    • 你能看出他的索引顺序有什么不同吗?例如,在这篇文章中:stackoverflow.com/a/30840656/2692962,我认为顺序与您的相反。
    • 完全一样,只是语法略有不同。
    • 请不要在没有显示尝试的地方提供代码。
    • @FilipKočica 我更新了一些我尝试过的代码(基于我得到的 2 个建议),并得到了不同的结果。你知道为什么会这样吗?
    • 抱歉:OP 有足够的代表和大量的徽章来提出更好的问题。
    猜你喜欢
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多