我有一个与设备固件通信的应用程序。由于固件发生更改,因此使用格式对其进行了版本控制{major}.{minor}.{revision}[beta[{beta}]]
。举几个例子,当前版本是0.4.7beta
,之后是0.4.7beta2
,有时0.4.7
是0.4.8beta
。不幸的是,固件的版本控制格式不受我的控制,因此我无法更改它。
我需要一种相互比较固件的方法。基本上我需要一个功能
boolean isFirmwareNewer(String testFW, String baseFW);
到目前为止,我所做的就是将这种格式转换为简单格式int
。因此0.4.7beta2
将变为00040702
(每个级别2位数字)。问题是
0.0.0
,从定义上讲它是较新的0.4.7beta2
不是较新0.4.7
)。这很容易解释(if (testFW.contains("beta")) testFWValue -= 100;
,但它也不是很优雅。你们通常如何做到这一点(或者您将如何做到)?
如果您愿意,我可以附加当前正在使用的代码,但是正如我所说,它是40行以上的代码,而且不是真正可读的(这就是我正在寻找一种更好的方法来执行此操作的原因)。
这是一个建议:
static int[] getVersionNumbers(String ver) {
Matcher m = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)(beta(\\d*))?")
.matcher(ver);
if (!m.matches())
throw new IllegalArgumentException("Malformed FW version");
return new int[] { Integer.parseInt(m.group(1)), // major
Integer.parseInt(m.group(2)), // minor
Integer.parseInt(m.group(3)), // rev.
m.group(4) == null ? Integer.MAX_VALUE // no beta suffix
: m.group(5).isEmpty() ? 1 // "beta"
: Integer.parseInt(m.group(5)) // "beta3"
};
}
static boolean isFirmwareNewer(String testFW, String baseFW) {
int[] testVer = getVersionNumbers(testFW);
int[] baseVer = getVersionNumbers(baseFW);
for (int i = 0; i < testVer.length; i++)
if (testVer[i] != baseVer[i])
return testVer[i] > baseVer[i];
return true;
}
它使用了一些技巧,并按如下方式转换了beta部分:
""
(无beta后缀)→Beta MAX_INT"beta"
→Beta 1(因为它以“ beta2”开头)"betaX"
→Beta X请注意,true
如果两个版本相同,它将返回。
问题内容: 我有两个字符串(它们实际上是版本号,它们可以是任何版本号) 我想比较哪个更大。在golang中如何做? 问题答案: 将“ 1.05.00.0156”转换为“ 0001” +“ 0005” +“ 0000” +“ 0156”,然后转换为int64。 将“ 1.0.221.9289”转换为“ 0001” +“ 0000” +“ 0221” +“ 9289”,然后转换为int64。 比较两个
问题内容: 我无法将Java应用程序作为HTML中的Web小程序启动(我使用的是HTML4.01,我知道它在html5中不起作用)。它返回的错误消息是: java:不支持的major.minor版本52.0 我尝试降级Java JRE / JDK / SDK,但仍然收到相同的错误消息。我正在使用的Java当前版本是1.8.0_05。 问题答案: 使用Java版本1.7或更低版本执行代码时,您的
Windows 请按照下列步骤在 Windows 上升级 Navicat Monitor: 在通知区域中,右击 并选择“检查更新”。 如果有新版本,点击“安装”。 升级完成后,Navicat Monitor 会自动启动。 macOS 请按照下列步骤在 macOS 上升级 Navicat Monitor: 在菜单栏,点击 并选择“检查更新”。 如果有新版本,点击“安装更新”。 下载完成后,点击“安装
问题内容: 在Eclipse中,我创建了一个链接到ejb和模型的EAR项目。我运行EAR时遇到以下错误: 无法部署Earkmz deploy is failing =部署期间发生错误:部署应用程序[earkmz]时发生异常:UnsupportedClassVersionError:分类it.j2ee.kmZ.business.impl.JPACartService具有不受支持的主要或次要版本号,该
我正在使用sun/oracle jdk 1.6。0_32和javac编译器似乎为目标1.5 jvm而不是1.6创建类文件。它不会接受-source 1.6-Target 1.6。使用javap查看生成的类文件显示一个主要版本:49而不是我所期望的50。Eclipse Indigo正确地创建了1.6兼容的类文件,主要版本为:50。我第一次注意到这一点是在eclipse中使用ant 1.8.2时,无法