как разобрать 3-х байтную метку BER-TLV - PullRequest
0 голосов
/ 21 марта 2020

Я работаю с некоторыми тегами EMV, большинство из которых имеют длину 1 или 2 байтов, например 9F02, 81,.. Я понимаю, что есть определенная битовая конфигурация, которую нужно знать как я могу определить длину тега для определения, является ли тег длиной 2 байта или больше, я использую:

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

, но я не знаю, когда у меня есть какой-то тег больше этого.

Я работаю с EMV Data, я тестирую с сертификационной картой, я получаю these tags are: DF8111, DF8119, DF811E, DF812C они относятся к CVM.

Ответы [ 2 ]

3 голосов
/ 22 марта 2020

Go - EMV 4.3 Книга 3 , Приложение B - Правила для объектов данных BER-TLV, разделы B1, B2, B3 . Если вы будете точно следовать этому правилу, вам не нужно будет хранить список тегов stati c; в нем четко сказано, как кодировать и интерпретировать длину и значения тега.

0 голосов
/ 22 марта 2020

Согласно

EMV 4.3 Книга 3

, Приложение B - Правила для BER-TLV Разделы объектов данных B1 , B2 , который был связан выше , вы должны проверить бит 8 в текущем байте, чтобы узнать, есть ли еще байт в теге, предполагая, что вы используете c / c ++ (как вы пометили его в этом посте), вот код, который можно использовать для проверки этого условия, я прокомментировал код ниже, где это условие и может использоваться вами.

        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

Надеюсь, это поможет вам.

...