【问题标题】:Number made of 4 chars with hex由 4 个带十六进制的字符组成的数字
【发布时间】:2015-03-29 05:30:17
【问题描述】:

我在用 C++ 编程,但我遇到了另一个“愚蠢”的问题。如果我有 4 个这样的字符:

char a = 0x90
char b = 0x01
char c = 0x00
char d = 0x00

当这一切都意味着十六进制数 0x00000190 时,即 400 十进制数。 如何将这些字符转换为一个 int?我知道我能做到

int number = a;

但这只会将一个 char 转换为 int。有人可以帮忙吗?

【问题讨论】:

  • 无符号数 = 无符号(a) | (无符号(b)
  • @DieterLücking 还是不行;如果 char 已签名,则 unsigned(a)0xFFFFFF90 等等。

标签: c++ char int hex


【解决方案1】:

你可以使用:

int number = (a & 0xFF)
           | ((b & 0xFF) << 8) 
           | ((c & 0xFF) << 16)
           | ((d & 0xFF) << 24);

使用无符号值会更简单。

【讨论】:

  • 为什么要屏蔽?这是完全没有必要的,并且使整个表达式难以阅读
  • 非常感谢你和其他人 :) 它现在可以工作了,但遗憾的是我不知道它是如何工作的。变化的东西:/
  • 你能告诉我,用 0xFF00 等“屏蔽”究竟是做什么的?
  • 看位运算符AND.
  • 很好,除了负数的左移未定义(5.8 移位运算符)
【解决方案2】:

喜欢这个

int number = ((d & 0xff) << 24) | ((c &0xff) << 16) | ((b & 0xff) << 8) | (a & 0xff);

&lt;&lt; 是位移运算符,&amp; 0xff 是在将表达式中的 char 提升为 int 时避免负值所必需的(完全正确的是 Jarod42)

【讨论】:

  • 感谢您解释 & 0xff :)
【解决方案3】:

这行得通:

unsigned char ua = a;
unsigned char ub = b;
unsigned char uc = c;
unsigned char ud = d;

unsigned long x = ua + ub * 0x100ul + uc * 0x10000ul + ud * 0x1000000ul

这类似于十进制的位值算术,但您使用的是基数 0x100 而不是基数 10。

如果你经常这样做,你可以将它封装在一个内联函数或宏中。


注意 - 到目前为止,在 (char)0x90 上使用按位运算发布的其他答案对于签署了普通 char 的系统都是错误的,因为他们忘记了 (char)0x90 在那里是负值,所以在积分促销之后应用了,左边有很多1位。

【讨论】:

  • 这也是我使用遮罩的原因。
猜你喜欢
  • 1970-01-01
  • 2018-05-17
  • 2012-05-07
  • 1970-01-01
  • 2013-08-05
  • 2017-06-17
  • 1970-01-01
  • 2014-05-13
  • 2012-05-30
相关资源
最近更新 更多