这是一个用于 ESP-IDF 工程的版本号比较组件。
- 支持纯数字方式比较 3 位或 4 位版本号大小。
- 支持纯数字方式判断 3 位或 4 位版本号是否完全相同。
- 支持字符串方式比较
"1.5.23"、"2.0.32.105"这类版本号大小。 - 支持字符串方式判断版本号是否完全相同。
version_checker/
├── include/
│ └── version_checker.h
├── src/
│ └── version_checker.c
├── CMakeLists.txt
├── idf_component.yml
└── README.md
头文件:
#include "version_checker.h"接口分类:
bool version_is_greater_parts(...);
bool version_is_equal_parts(...);
bool version_is_greater_string(const char *current_version, const char *compare_version);
bool version_is_equal_string(const char *current_version, const char *compare_version);说明:
version_is_greater_parts(...)支持 6 个参数和 8 个参数两种形式,分别对应 3 位版本号和 4 位版本号。version_is_equal_parts(...)支持 6 个参数和 8 个参数两种形式,分别对应 3 位版本号和 4 位版本号。version_is_greater_string(...)和version_is_equal_string(...)要求两边的版本号位数一致。
bool result1 = version_is_greater_parts(1, 5, 26, 1, 5, 25);
bool result2 = version_is_greater_parts(2, 0, 32, 105, 2, 0, 32, 104);
bool result3 = version_is_equal_parts(1, 5, 23, 1, 5, 23);
bool result4 = version_is_equal_parts(2, 0, 32, 105, 2, 0, 32, 105);bool result1 = version_is_greater_string("1.5.26", "1.5.25");
bool result2 = version_is_greater_string("2.0.32.105", "2.0.32.104");
bool result3 = version_is_equal_string("1.5.23", "1.5.23");
bool result4 = version_is_equal_string("2.0.32.105", "2.0.32.105");下面示例整理自 main/main.c 中的测试代码,可直接用于串口日志验证:
bool parts_greater_3_true = version_is_greater_parts(1, 5, 26, 1, 5, 25);
ESP_LOGI(TAG, "比较 1.5.26 是否大于 1.5.25: %s", parts_greater_3_true ? "true" : "false");
bool parts_greater_3_false = version_is_greater_parts(1, 5, 25, 1, 5, 26);
ESP_LOGI(TAG, "比较 1.5.25 是否大于 1.5.26: %s", parts_greater_3_false ? "true" : "false");
bool parts_greater_4_true = version_is_greater_parts(2, 0, 32, 105, 2, 0, 32, 104);
ESP_LOGI(TAG, "比较 2.0.32.105 是否大于 2.0.32.104: %s", parts_greater_4_true ? "true" : "false");
bool parts_greater_4_false = version_is_greater_parts(2, 0, 32, 104, 2, 0, 32, 105);
ESP_LOGI(TAG, "比较 2.0.32.104 是否大于 2.0.32.105: %s", parts_greater_4_false ? "true" : "false");
bool parts_equal_3_true = version_is_equal_parts(1, 5, 23, 1, 5, 23);
ESP_LOGI(TAG, "比较 1.5.23 是否等于 1.5.23: %s", parts_equal_3_true ? "true" : "false");
bool parts_equal_3_false = version_is_equal_parts(1, 5, 23, 1, 5, 24);
ESP_LOGI(TAG, "比较 1.5.23 是否等于 1.5.24: %s", parts_equal_3_false ? "true" : "false");
bool parts_equal_4_true = version_is_equal_parts(2, 0, 32, 105, 2, 0, 32, 105);
ESP_LOGI(TAG, "比较 2.0.32.105 是否等于 2.0.32.105: %s", parts_equal_4_true ? "true" : "false");
bool parts_equal_4_false = version_is_equal_parts(2, 0, 32, 105, 2, 0, 32, 106);
ESP_LOGI(TAG, "比较 2.0.32.105 是否等于 2.0.32.106: %s", parts_equal_4_false ? "true" : "false");
bool string_greater_3_true = version_is_greater_string("1.5.26", "1.5.25");
ESP_LOGI(TAG, "比较 \"1.5.26\" 是否大于 \"1.5.25\": %s", string_greater_3_true ? "true" : "false");
bool string_greater_3_false = version_is_greater_string("1.5.25", "1.5.26");
ESP_LOGI(TAG, "比较 \"1.5.25\" 是否大于 \"1.5.26\": %s", string_greater_3_false ? "true" : "false");
bool string_greater_4_true = version_is_greater_string("2.0.32.105", "2.0.32.104");
ESP_LOGI(TAG, "比较 \"2.0.32.105\" 是否大于 \"2.0.32.104\": %s", string_greater_4_true ? "true" : "false");
bool string_greater_4_false = version_is_greater_string("2.0.32.104", "2.0.32.105");
ESP_LOGI(TAG, "比较 \"2.0.32.104\" 是否大于 \"2.0.32.105\": %s", string_greater_4_false ? "true" : "false");
bool string_equal_3_true = version_is_equal_string("1.5.23", "1.5.23");
ESP_LOGI(TAG, "比较 \"1.5.23\" 是否等于 \"1.5.23\": %s", string_equal_3_true ? "true" : "false");
bool string_equal_3_false = version_is_equal_string("1.5.23", "1.5.24");
ESP_LOGI(TAG, "比较 \"1.5.23\" 是否等于 \"1.5.24\": %s", string_equal_3_false ? "true" : "false");
bool string_equal_4_true = version_is_equal_string("2.0.32.105", "2.0.32.105");
ESP_LOGI(TAG, "比较 \"2.0.32.105\" 是否等于 \"2.0.32.105\": %s", string_equal_4_true ? "true" : "false");
bool string_equal_4_false = version_is_equal_string("2.0.32.105", "2.0.32.106");
ESP_LOGI(TAG, "比较 \"2.0.32.105\" 是否等于 \"2.0.32.106\": %s", string_equal_4_false ? "true" : "false");