微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何解码C中的主要和次要版本半字节?

如何解决如何解码C中的主要和次要版本半字节?

我目前正在研究 i.MX6 (Android BSP) 和 NTAG 5 boost 组件之间的 I2C 通信。

我想对 NTAG 5 EEPROM 的块 0 处的能力容器进行解码。 我编写了一个 C 函数来解码 CC 字节 1 的主要和次要版本,如本表中所述。

enter image description here

这是我的功能

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] = '\0';

考虑not using global variables并做bool F_decodeVersion(NTAG_HANDLE_T ntag,char *CH_version);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。