【问题标题】:How to merge 4 unsigned char array elements in one hex value?如何将 4 个无符号字符数组元素合并为一个十六进制值?
【发布时间】:2019-01-31 04:17:15
【问题描述】:

我有一个包含 4 个 unsigned char 类型元素的数组。如何将这些合并为一个十六进制值?我需要将此值转换为 IEE754 值。

例如unsigned char arr[]={0x41,0xD9,0xD4,0x03}

预期的 o/p :0x41D9D403

【问题讨论】:

  • 多字节类型的问题在于字节顺序。一旦你确定这是一个简单的memcpy 调用。或者,由于您使用 C,因此您可以将 union 用于 type punning
  • 这就是你说的字节顺序。请建议。无符号字符结果;结果 = arr[0]
  • 没有“十六进制值”这样的东西;你的意思是一个整数值的十六进制字符串表示,或者在这种情况下更可能是一个32位整数。十六进制只是整数值的人类可读表示;通常用于数据的表示或 ASCII 编码,不用于内部表示。
  • @Someprogrammerdude 不,您不应该使用 memcpy 或 union(或指针算术),因为它们取决于字节序。正确的解决方案是使用便携式位移,其他一切都是错误的。
  • @Lundin memcpy 或联合在字节排序问题解决后就可以了。也许我在评论中对此有点模糊。而来自charmemcpy 数组或联合是在不破坏严格别名的情况下进行类型双关的唯一方法。

标签: c embedded embedded-linux


【解决方案1】:
unsigned long hex_val = ((unsigned long)arr[0] << 24) | ((unsigned long)arr[1] << 16) | ((unsigned long)arr[2] << 8) | ((unsigned long)arr[3]);

【讨论】:

  • 在 32 位系统上,这会为 arr[0] &gt;= 0x80 调用未定义的行为。正确的代码在移位之前将每个操作数转换为unsigned long。请更正示例。
  • @Lundin - 未定义的行为是因为以下原因吗? 1) arr[0] 为unsigned char,在移位操作期间提升为int。 2) 让我们考虑一个有sizeof(int) == 2arr[0] &gt;= 0x80 的系统。 3) 如果我们移动 8 个位置,即arr[0] &lt;&lt; 8,则设置符号位,这不是我们所期望的,因为arr[0]unsigned char
  • 确实!如果是 32 位计算机,则 0x80 int。
猜你喜欢
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 2015-05-05
  • 2014-02-20
相关资源
最近更新 更多