EXE版本号——如何正确比较次要版本

发布于 2024-12-12 02:29:02 字数 285 浏览 0 评论 0原文

Windows EXE 文件附加有版本号,由点分隔的四位数字组成(例如 1.0.0.0)。

问题:比较这些数字的正确方法是什么?特别地,1.15.0.0>1.15.0.0>1.15.0.0>1.15.0.0。 1.2.0.0(因为 15 > 2)还是反之亦然(因为,数学上,1.15 < 1.2)?


背景:我的一个应用程序已达到 3.9.*,我想知道我是否可以继续使用 3.10.*,而无需安装程序或其他比较版本号的组件造成麻烦。

Windows EXE files have version numbers attached to them, consisting of four digits separated by dots (e.g. 1.0.0.0).

Question: What is the correct way to compare these numbers? In particular, is 1.15.0.0 > 1.2.0.0 (since 15 > 2) or vice versa (since, mathematically, 1.15 < 1.2)?


Background: One of my applications has reached 3.9.* and I would like to know wheter I can continue with 3.10.* without installers or other components that compare version numbers causing trouble.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

零度° 2024-12-19 02:29:02

正确的方法是将每个组件(以句点“.”分隔)依次视为数字而不是字符串值。所以,是的 1.15.0.0 是 > 1.2.0.0

如果您使用 Powershell,它有一个内置版本对象(基于 .NET 的 System.Version type): [version] 将为您执行此功能。

[作为参考,各个组件为 Major.Minor.Build.Revision]

The correct way is to consider each component (delimited by periods '.') in turn as a numeric rather than string value. So, yes 1.15.0.0 is > 1.2.0.0

If you use Powershell it has a built-in version object (based on .NET's System.Version type): [version] that will perform this functionality for you.

[For reference, the individual components are Major.Minor.Build.Revision]

ゝ杯具 2024-12-19 02:29:02

如 MSDN 本页所述< /a>:

版本由两个 32 位整数组成,由四个 16 位整数定义
整数。

这意味着,给定格式为“Major.Minor.Release.Build”的两个版本,您可以确信最终总会有足够的数据将它们组装成 64 位无符号整数值,如下所示:

int64_t i1 = (v1->Major << 48) | (v1->Minor << 32) | (v1->Release << 16) | v1->Build;
int64_t i2 = (v2->Major << 48) | (v2->Minor << 32) | (v2->Release << 16) | v2->Build;

所以您现在可以比较两个 64 位值,例如:

if (i1 > i2) { ... }

抱歉 5 年后才解决这个问题,但我当时正在四处走动......

As stated in MSDN at this page:

The version consists of two 32-bit integers, defined by four 16-bit
integers.

This mean, given two versions in format "Major.Minor.Release.Build", you can be confident you'll always end up having enough data to assemble them into 64-bit unsigned integer values like this:

int64_t i1 = (v1->Major << 48) | (v1->Minor << 32) | (v1->Release << 16) | v1->Build;
int64_t i2 = (v2->Major << 48) | (v2->Minor << 32) | (v2->Release << 16) | v2->Build;

So you can now just compare two 64 bit values like:

if (i1 > i2) { ... }

Sorry for solving it after 5 years, but I was walking around...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文