Когда вы читаете BERTLV, когда вы останавливаетесь?
У меня есть следующий BERTLV:61394F0BA00000030800001001234579074F05A000012345500E49442D4F6E65205049562042494F5F50107777772E6F626572746875722E636F6D7F66080202800002028000
Я пытаюсь разобрать это рекурсивным способом, поэтому я отношусь к первой части как к TLV.
Тег: 0x61
Лен: 0x39
, Значение: 4F0BA00000030800001001234579074F05A000012345500E49442D4F6E65205049562042494F5F50107777772E6F626572746875722E636F6D
Тогда я ломаю это дальше, и получаю
Тег: 0x4F
Лен: 0x0B
, Значение:A000000308000010012345
Теперь, как мне остановиться? На данный момент я знаю, что это значение является последним этапом этого TLV и не является другим вложенным TLV.
2 ответа
Хорошо, после долгих копаний, я узнал, что простое TAG
на самом деле больше, чем просто число, TAG
сам на самом деле закодировал кучу информации там. Я приказываю выяснить, TLV
содержит вложенные TLV
чтобы мой код знал, когда продолжить обработку, а когда остановить, мне пришлось декодировать TAG
,
Итак TAG
содержит 8 битов, и каждый из них имеет особое значение:
Бит, который мне был нужен, был B5
для того, чтобы определить, является ли текущий TLV
является Constructed
или нет... когда есть Constructed
это означает, что ток TLV
состоит из нескольких TLV
поэтому для своего кода я использую эту информацию для рекурсивного поиска вложенных TLV
,
Когда TLV
не Constructed
это мой случай остановки, чтобы всплыть.
Вот мой рекурсивный вывод функции путем анализа данных и проверки бита B5
в TAG
:
11:20:38.428 Parsing: 61394F0BA00000030800001000010079074F05A000000308500E49442D4F6E65205049562042494F5F50107777772E6F626572746875722E636F6D7F66080202800002028000
11:20:38.436 Constructed Data Object
11:20:38.437 Parsing: 4F0BA00000030800001000010079074F05A000000308500E49442D4F6E65205049562042494F5F50107777772E6F626572746875722E636F6D
11:20:38.437 Primitive Data Object
11:20:38.437 tag: 79, len: 11, value: A000000308000010000100
11:20:38.437 Constructed Data Object
11:20:38.437 Parsing: 4F05A000000308
11:20:38.437 Primitive Data Object
11:20:38.437 tag: 79, len: 5, value: A000000308
11:20:38.437 Primitive Data Object
11:20:38.437 tag: 80, len: 14, value: 49442D4F6E65205049562042494F
11:20:38.437 MultiByte tag
11:20:38.437 Primitive Data Object
11:20:38.437 tag: 24400, len: 16, value: 7777772E6F626572746875722E636F6D
11:20:38.438 MultiByte tag
11:20:38.438 Constructed Data Object
11:20:38.438 Parsing: 0202800002028000
11:20:38.438 Primitive Data Object
11:20:38.438 tag: 2, len: 2, value: 8000
11:20:38.438 Primitive Data Object
11:20:38.438 tag: 2, len: 2, value: 8000
Q: Теперь, как мне остановиться?
A: Длина TAG (0x0B) представлена в HEX и показывает количество байтов в значении. Каждый байт представлен в вашем примере как 2 (два) шестнадцатеричных символа. Таким образом, 0x0B, который является 11 в десятичном виде, покажет вам 11*2 = 22 символа в значении для использования.
Вот пример разбора вашего буфера BER-TLV, проанализированного с помощью инструмента https://iso8583.info/lib/EMV/TLVs:
---
# Cheef's parser.
# Copyright (C) 2008-2017 Alexander Shevelev. https://iso8583.info/
# lib : "/lib/EMV/" - Integrated Circuit Card Specifications for Payment Systems
# tool : "TLVs"
# stat : 40 nodes, 4 lookup tables, 25.00% passed (1/4)
TLVs:#"61394F0BA00000030800001001234579074F05A000012345500E49442D4F..8000" # EMV, Tag + Length + Value (TLV) series
- x61:#"61394F0BA00000030800001001234579074F05A000012345500E49442D4F..6F6D" # ISO 7816, Template, Application
- tag: "61"
- len: "39" # // 57
- val:#"4F0BA00000030800001001234579074F05A000012345500E49442D4F6E65..6F6D" # Template, Application.
- x4F:#"4F0BA000000308000010012345" # ISO 7816, Application Identifier (AID), Card
- tag: "4F"
- len: "0B" # // 11
- val:#"A000000308000010012345" # AID, Card.
- RID: "A000000308" # Registered Application Provider Identifier (RID) // National Institute of Standards and Technology
- PIX: "000010012345" # Proprietary Application Identifier Extension (PIX)
- x79:#"79074F05A000012345" # ISO 7816, Coexistent Tag Allocation Authority
- tag: "79"
- len: "07" # // 7
- val:#"4F05A000012345"
- x4F:#"4F05A000012345" # ISO 7816, Application Identifier (AID), Card
- tag: "4F"
- len: "05" # // 5
- val:#"A000012345" # AID, Card.
- RID: "A000012345" # Registered Application Provider Identifier (RID)
- x50:#"500E49442D4F6E65205049562042494F" # ISO 7816, Application Label
- tag: "50"
- len: "0E" # // 14
- val: "49442D4F6E65205049562042494F" # Application Label. // ID-One PIV BIO
- x5F50:#"5F50107777772E6F626572746875722E636F6D" # ISO 7816, Uniform resource locator (URL)
- tag: "5F50"
- len: "10" # // 16
- val: "7777772E6F626572746875722E636F6D" # URL. // www.oberthur.com
- x7F66:#"7F66080202800002028000"
- tag: "7F66"
- len: "08" # // 8
- val:#"0202800002028000"
- x02:#"02028000"
- tag: "02"
- len: "02" # // 2
- val: "8000"
- x02:#"02028000"
- tag: "02"
- len: "02" # // 2
- val: "8000"