如何解码 C 中的主要和次要版本半字节?
How to decode major and minor version nibble in C?
我目前正在研究 i.MX6(Android BSP)和 NTAG 5 升压组件之间的 I2C 通信。
我想解码位于 NTAG 5 EEPROM 块 0 的能力容器。
我已经编写了一个 C 函数来解码 CC 字节 1 的主要版本和次要版本,如 table.
中所述
这是我的功能:
static char CH_version[4] = "0.0";
bool F_decodeVersion(NTAG_HANDLE_T ntag) {
uint8_t UI_localVersionAccessCondition;
bool B_status = false;
/* Reads byte 1 */
if (!F_readCCByte(ntag, VERSION_ACCESS_COND_BYTE, &UI_localVersionAccessCondition)) {
B_status = false;
}
/* To get the high nibble corresponding to version, we shift the value
four bits to the right */
UI_localVersionAccessCondition = UI_localVersionAccessCondition >> 4;
/* Decode */
switch(UI_localVersionAccessCondition) {
case 0x00:
memcpy(CH_version, "0.0", 4);
break;
case 0x01:
memcpy(CH_version, "0.1", 4);
break;
case 0x02:
memcpy(CH_version, "0.2", 4);
break;
case 0x03:
memcpy(CH_version, "0.3", 4);
break;
case 0x04:
memcpy(CH_version, "1.0", 4);
break;
case 0x05:
memcpy(CH_version, "1.1", 4);
break;
case 0x06:
memcpy(CH_version, "1.2", 4);
break;
case 0x07:
memcpy(CH_version, "1.3", 4);
break;
case 0x08:
memcpy(CH_version, "2.0", 4);
break;
case 0x09:
memcpy(CH_version, "2.1", 4);
break;
case 0x0A:
memcpy(CH_version, "2.2", 4);
break;
case 0x0B:
memcpy(CH_version, "2.3", 4);
break;
case 0x0C:
memcpy(CH_version, "3.0", 4);
break;
case 0x0D:
memcpy(CH_version, "3.1", 4);
break;
case 0x0E:
memcpy(CH_version, "3.2", 4);
break;
case 0x0F:
memcpy(CH_version, "3.3", 4);
break;
}
return true;
}
我敢肯定这不是解码此半字节的最佳方法。
我想我应该使用模运算符。
我怎样才能更有效地做到这一点?
您可以尝试仅使用移位和掩码。
CH_version[0] = (UI_localVersionAccessCondition >> 6) & 0x3 + '0';
CH_version[1] = '.';
CH_version[2] = (UI_localVersionAccessCondition >> 4) & 0x3 + '0';
CH_version[3] = '[=10=]';
考虑 not using global variables 并执行 bool F_decodeVersion(NTAG_HANDLE_T ntag, char *CH_version);
我目前正在研究 i.MX6(Android BSP)和 NTAG 5 升压组件之间的 I2C 通信。
我想解码位于 NTAG 5 EEPROM 块 0 的能力容器。 我已经编写了一个 C 函数来解码 CC 字节 1 的主要版本和次要版本,如 table.
中所述这是我的功能:
static char CH_version[4] = "0.0";
bool F_decodeVersion(NTAG_HANDLE_T ntag) {
uint8_t UI_localVersionAccessCondition;
bool B_status = false;
/* Reads byte 1 */
if (!F_readCCByte(ntag, VERSION_ACCESS_COND_BYTE, &UI_localVersionAccessCondition)) {
B_status = false;
}
/* To get the high nibble corresponding to version, we shift the value
four bits to the right */
UI_localVersionAccessCondition = UI_localVersionAccessCondition >> 4;
/* Decode */
switch(UI_localVersionAccessCondition) {
case 0x00:
memcpy(CH_version, "0.0", 4);
break;
case 0x01:
memcpy(CH_version, "0.1", 4);
break;
case 0x02:
memcpy(CH_version, "0.2", 4);
break;
case 0x03:
memcpy(CH_version, "0.3", 4);
break;
case 0x04:
memcpy(CH_version, "1.0", 4);
break;
case 0x05:
memcpy(CH_version, "1.1", 4);
break;
case 0x06:
memcpy(CH_version, "1.2", 4);
break;
case 0x07:
memcpy(CH_version, "1.3", 4);
break;
case 0x08:
memcpy(CH_version, "2.0", 4);
break;
case 0x09:
memcpy(CH_version, "2.1", 4);
break;
case 0x0A:
memcpy(CH_version, "2.2", 4);
break;
case 0x0B:
memcpy(CH_version, "2.3", 4);
break;
case 0x0C:
memcpy(CH_version, "3.0", 4);
break;
case 0x0D:
memcpy(CH_version, "3.1", 4);
break;
case 0x0E:
memcpy(CH_version, "3.2", 4);
break;
case 0x0F:
memcpy(CH_version, "3.3", 4);
break;
}
return true;
}
我敢肯定这不是解码此半字节的最佳方法。 我想我应该使用模运算符。
我怎样才能更有效地做到这一点?
您可以尝试仅使用移位和掩码。
CH_version[0] = (UI_localVersionAccessCondition >> 6) & 0x3 + '0';
CH_version[1] = '.';
CH_version[2] = (UI_localVersionAccessCondition >> 4) & 0x3 + '0';
CH_version[3] = '[=10=]';
考虑 not using global variables 并执行 bool F_decodeVersion(NTAG_HANDLE_T ntag, char *CH_version);