【问题标题】:Converting 8 byte char array into long将 8 字节 char 数组转换为 long
【发布时间】:2015-08-23 14:13:12
【问题描述】:

<< 不适用于 long 类型,我们如何将 8 字节字符数组转换为 long?

#define word_size 8

long num = 0;
char a[word_size] = "\x88\x99\xaa\x0bb\xcc\xdd\xee\xff";

for (i=0; i < word_size;i++) {
   a[(word_size-1) - i] |= (num << (8*(word_size - i - 1))) & 0xFF;
}

printf("%lx\n", num);

【问题讨论】:

  • &lt;&lt;long 配合得很好。在这种情况下,num 始终为 0,因此您将 a 清除为全 0。
  • long 不一定是 64 位。如果您想确定,请使用来自stdint.hint64_t。这就是建议的方式。另外,请确保数组具有正确的字节顺序。

标签: c arrays types shift


【解决方案1】:

下面的代码效率更高:

unsigned char[word_size] = ...;
int64_t num = 0;
for ( int i = 0 ; i < sizeof(a) ; i++ )
    num = (num << 8) | a[i];

这假定数组中的字节是大端(最高字节优先)排序。对于小端(您似乎使用)只需自上而下处理它:

for ( int i = sizeof(a) ; --i >= 0 ; )

注意:char 是有符号还是无符号取决于实现,因此将其确定为无符号,否则逻辑或将不起作用。更好地使用uint8_t;被定义为 8 位,而char不是

注意:您应该对常量使用全大写:WORD_SIZE 而不是 word_size。这是一个普遍接受的标准(C 中唯一关于标识符的情况)。

【讨论】:

  • 谢谢你,我试图将一个 8 字节的 char 数组转换为 long long,这是我能找到的唯一方法。
  • @DaveCole:我很高兴它有帮助。请记住在移动有符号值时要小心。我通常强烈建议仅将 unsigned 类型用于移位。另请注意,long long 不需要具有 64 位,并且 byte/char(请参阅文本)也不需要具有 8 位。使用正确的类型可以使您的代码更加自文档化。即使这不是生产代码,您也可能会在几年后重视它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
相关资源
最近更新 更多