由 4 个十六进制字符组成的数字
Number made of 4 chars with hex
我正在用 C++ 编程,我遇到了另一个 "stupid" 问题。如果我有 4 个这样的字符:
char a = 0x90
char b = 0x01
char c = 0x00
char d = 0x00
当这一切都意味着十六进制数 0x00000190 即 400 十进制数。
如何将这些字符转换为一个整数?我知道我能做到
int number = a;
但这只会将一个字符转换为整数。有人可以帮忙吗?
像这样
int number = ((d & 0xff) << 24) | ((c &0xff) << 16) | ((b & 0xff) << 8) | (a & 0xff);
<<
是位移运算符, & 0xff
是在表达式中将 char
提升为 int
时避免负值所必需的(Jarod42 完全正确)
您可以使用:
int number = (a & 0xFF)
| ((b & 0xFF) << 8)
| ((c & 0xFF) << 16)
| ((d & 0xFF) << 24);
使用无符号值会更简单。
这个有效:
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
位。
我正在用 C++ 编程,我遇到了另一个 "stupid" 问题。如果我有 4 个这样的字符:
char a = 0x90
char b = 0x01
char c = 0x00
char d = 0x00
当这一切都意味着十六进制数 0x00000190 即 400 十进制数。 如何将这些字符转换为一个整数?我知道我能做到
int number = a;
但这只会将一个字符转换为整数。有人可以帮忙吗?
像这样
int number = ((d & 0xff) << 24) | ((c &0xff) << 16) | ((b & 0xff) << 8) | (a & 0xff);
<<
是位移运算符, & 0xff
是在表达式中将 char
提升为 int
时避免负值所必需的(Jarod42 完全正确)
您可以使用:
int number = (a & 0xFF)
| ((b & 0xFF) << 8)
| ((c & 0xFF) << 16)
| ((d & 0xFF) << 24);
使用无符号值会更简单。
这个有效:
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
位。