【问题标题】:insert array of hex codes into an integer将十六进制代码数组插入整数
【发布时间】:2026-02-15 15:55:01
【问题描述】:

我正在尝试做一些我认为非常基本的事情,但要么我只是忽略了一些显而易见的事情,要么它实际上有点棘手。我的问题是:我有一个包含 4 个十六进制值的 4 个字符的数组。例如:

array[0] = 0xD8
array[1] = 0xEC
array[2] = 0xA2 
array[3] = 0x83

我想将此数组存储在一个带有组合值的整数中,在本例中为 0xD8ECA283

我尝试过进行逻辑或然后移动位,通过这种方法,我设法将 0xD8 的值存储在整数中,而不是其余的。任何提示将不胜感激。

【问题讨论】:

  • 显示代码,我们会从那里帮助您。
  • 为什么不直接使用数组,就好像它是一个指向整数的指针一样呢?例如。 int integer = *((int*)array).
  • @Witiko 因为Endianness.
  • @Witiko 由于字节序问题,这可能不起作用。根据是大端还是小端平台,您获得的价值会有所不同
  • @Witiko:你也可能面临对齐问题。

标签: c


【解决方案1】:

使用二进制或运算符,以及一个精度保证至少为 32 位的整数,即 unsigned long 类型(尽管也可以使用 uint_least32_t 类型)。

使用无符号整数,因此可以避免在移动有符号整数时出现的任何潜在的未定义和/或实现定义的行为。

此解决方案与字节顺序无关。

unsigned long a = ( ( ( unsigned long )array[0] & 0xFF ) << 24 ) |
                  ( ( ( unsigned long )array[1] & 0xFF ) << 16 ) |
                  ( ( ( unsigned long )array[2] & 0xFF ) << 8 ) |
                  ( ( ( unsigned long )array[3] & 0xFF ) << 0 ) ;

强制转换为( unsigned long ) 是为了避免中间隐式转换为int
&amp; 0xFF 操作用于删除不必要的位(如果在 CHAR_BIT != 8 的不太可能的情况下有任何位)。

【讨论】:

  • @DrKoch 是的,这是为了保持一致性和可读性。
  • 这解决了我的问题,但我接受了另一个答案,因为我认为它更容易阅读。不过还是谢谢
【解决方案2】:

应该这样做:

int i;
int combined = 0;
for (i = 0; i < 4; i++) {
    combined = (combined << 8) | ((unsigned char) array[i]);
}

【讨论】:

  • 哇,这实际上与我尝试的非常接近,所以至少我走在了正确的轨道上。应该坚持更长时间。无论如何,感谢您的帮助