我有一个应用程序的版本号,格式为 0x00870016,其中前 4 个十六进制数字表示版本号的第一部分,第二个 4 位表示第二部分,因此在此示例中版本号为 135.22。
我试图弄清楚(在 C++ 中)我将如何分别提取这些数字以将它们显示为字符串。
我有一个应用程序的版本号,格式为 0x00870016,其中前 4 个十六进制数字表示版本号的第一部分,第二个 4 位表示第二部分,因此在此示例中版本号为 135.22。
我试图弄清楚(在 C++ 中)我将如何分别提取这些数字以将它们显示为字符串。
通过使用掩码和班次的组合:
int main()
{
const uint32_t v = 0x00870016;
const uint16_t major = (v & 0xFFFF0000) >> 16;
const uint16_t minor = v & 0x0000FFFF;
cout << major << "." << minor << "\n";
}
输出:
135.22
解释:
0x00870016
是一个 32 位的数字。您的主版本号由 16 个最重要的数字组成,次要版本号是 16 个最不重要的数字。
为了提取主要版本号,让我们找出 16 个 MSBit 是通过使用0xFFFF0000
-- 一个数字来屏蔽输入值,其中所有 16 个最高有效位都设置为1
,所有最低位是0
:
0x00870016 && 0xFFFF0000 = 0x00870000
结果值是您的主要版本号,左移 16 位。所以让我们把它转移过来:
0x00870000 >> 16 = 0x00000087
我们有你真正的主要版本号。
提取次要版本号是类似的,只是我们不必转换。
笔记:
第一步可以通过跳过掩码来简化:
const uint16_t major = v >> 16;
这是有效的,因为 C++ 标准规定,当您右移时,空出的位将填充0
s。所以最终的程序是:
int main()
{
const uint32_t v = 0x00870016;
const uint16_t major = v >> 16;
const uint16_t minor = v & 0x0000FFFF;
cout << major << "." << minor << "\n";
}
编辑:
如评论中所述,您可能会得到0x00870016
一个字符串,而不是一个数字。我们只需要将这个字符串转换成它的等价数字。处理领先0x
似乎是一个绊脚石,但如果您使用 C++ 标准库 iostream 操纵器,情况并非如此:
int main()
{
const std::string inVer = "0x00870016";
uint32_t v = 0;
std::stringstream ss;
ss << inVer;
ss >> std::hex >> v;
const uint16_t major = v >> 16;
const uint16_t minor = v & 0x0000FFFF;
cout << major << "." << minor << "\n";
}
unsigned version = 0x00870016;
unsigned major = version >> 16;
unsigned minor = version & 0xffff;
printf("Version %u.%u\n", major, minor);
或者
std::cout << "Version " << major << "." << minor << std::endl;