【问题标题】:How to Concatenate Hex Numbers?如何连接十六进制数字?
【发布时间】:2013-04-18 23:33:58
【问题描述】:

我一直在尝试连接 4 个十六进制数字,但似乎无法做到。

例子:

int a = 0x01;
int b = 0x00;
int c = 0x20;
int d = 0xF1;
//Result should be 0x010020F1

我使用sprintf() 和按位运算得到的结果总是截断零,给了我像 1020F1 这样的答案,这与我想要的有很大不同。谁有更好的方法?

【问题讨论】:

  • 如果你想使用snprintf(),那么:snprintf(buffer, sizeof(buffer), "0x%.2X%.2X%.2X%.2X", a, b, c, d); 应该可以解决问题,除非buffer 的长度小于 11 个字节。
  • 如果您只想打印,请使用printf("0x%02x%02x%02x%02x\n", a,b,c,d);
  • @Eddy_Em:过于挑剔,使用X 来获得所需结果的F1 部分。
  • @JonathanLeffler,同意,我没有注意到大 F。

标签: c hex concatenation


【解决方案1】:

假设unsigned int a,b,c,d;

unsigned int result = (a<<24) | (b<<16)| (c<<8) | d;

但这本质上是依赖于实现的,因为 C++ 标准只规定了整数的最小大小。

所以对于uint32_t a, b, c, d

uint32_t result = (a<<24) | (b<<16)| (c<<8) | d;

【讨论】:

  • 这个答案正确使用了unsigned int。我们应该强调无符号。如果标识符是问题中的int,则a&lt;&lt;24 可能未定义。
  • 在一般情况下,为了获得最大的可移植性(即,对于具有 16 位 int 的机器),需要进行一些强制转换:uint32_t result = ((uint32_t )a&lt;&lt;24) | ((uint32_t )b&lt;&lt;16)| (c&lt;&lt;8) | d;
猜你喜欢
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2011-05-15
  • 2019-09-29
  • 2017-08-23
  • 2018-05-17
相关资源
最近更新 更多