如何解析3字节长度的BER-TLV TAG

how to parse 3 byte length BER-TLV TAG

我正在使用一些 EMV 标签,例如,其中大多数标签的长度为 12 字节 9F02, 81,.. 我知道有一个特定的位配置知道我如何确定标签长度以确定标签是否为 2 字节长度或更大,我使用:

unsigned char tags[]={0x9F,0x02};
if((tags[0]&0x1F)==0x1F){
  ...
}

但当我有比这更大的标签时,我不知道该怎么做。

我正在使用 EMV 数据,我正在使用认证卡进行测试,我正在收到 these tags are: DF8111, DF8119, DF811E, DF812C 它们与 CVM 相关。

查看 EMV 4.3 Book 3,附件 B - BER-TLV 数据对象规则部分 B1、B2、B3。 如果您严格遵循这一点,那么您就不需要存储标签的静态列表;它清楚地说明了如何编码和解释标签长度和值。

根据

EMV 4.3 Book 3

,附件 B - BER-TLV 数据对象部分 B1 的规则,B2 被链接到 above,你应该检查当前字节中的位 8 以了解标签中是否有更多字节,假设你正在使用 c/c++(正如您在此 post 中标记的那样)这是可以用来检查该条件的代码,我在下面注释了条件所在的代码,并且可以由你.

        int start = 0;
        int end = start + len;
        while (start < end) {

            int tag = src[start++] & 0xFF;

            if (tag == 0x00 || tag == 0xFF) {
                continue;
            }

            if ((tag & 0x1F) == 0x1F) {
                if (start >=  len ) {
                    break;
                }

                tag = (tag << 8) | src[start++] & 0xFF;
                // tag has 3 bytes (0xFFFFFF)
                /// check this line it could what you need.
                if ((tag & 0x80) != 0) {
                    if (start >=  len ) {
                        break;
                    }
                    //// Append third byte to the Tag.
                    tag = (tag << 8) | src[start++] & 0xFF;
                } 
            }
       /// ...
} ///end while

希望对你有所帮助。