Я создаю собственное решение для выставления счетов для своей компании. Правительство требует, чтобы мы создавали поля QR-кода, закодированные в формате Tag-Length-Value (TLV).

Кодирование TLV должно быть следующим:

Тег: значение тега, как упомянуто выше, хранится в одном байте.

Длина: длина массива байтов, полученная в результате кодировки UTF8 значения поля. Длина должна храниться в одном байте.

Значение: байтовый массив, полученный в результате кодировки UTF8 значения поля.

В примере они предоставили этот вывод Base64

AQkxMjM0NTY3ODkCCjEyLzEyLzIwMjADBDEwMDADAzE1MPaIn2Z2jg6VqWvWV6IrZZNzLF7xvZrWXW5xRV5yFY2xFu0ycXOiyqV0k7Wsh6b1IcE2Tfzap1AQAQVsktmsv1FFQ1MxIAAAAGKblFMh9nFRSn8tvftXqo9zRSz2VEAPITSZ3W7UDHKhUx+7yXGijLtJSZGXMOc+jpKwARzDl68GmmRd75NWdOs=

Когда я декодирую с помощью

$base64 = "AQkxMjM0NTY3ODkCCjEyLzEyLzIwMjADBDEwMDADAzE1MPaIn2Z2jg6VqWvWV6IrZZNzLF7xvZrWXW5xRV5yFY2xFu0ycXOiyqV0k7Wsh6b1IcE2Tfzap1AQAQVsktmsv1FFQ1MxIAAAAGKblFMh9nFRSn8tvftXqo9zRSz2VEAPITSZ3W7UDHKhUx+7yXGijLtJSZGXMOc+jpKwARzDl68GmmRd75NWdOs=";
echo base64_decode($base64); 

Я получаю такой ответ:

    123456789
12/12/20201000150���fv���k�W�+e�s,^��]nqE^r���2qs�ʥt������!�6M�ڧPl�٬�QECS1 b��S!�qQJ-��W��sE,�T@!4��n�r�S��q���II��0�>���×��d]�Vt�

Тег 1: Имя продавца

Тег 2: Регистрационный номер НДС

Тег 3: Отметка времени счета-фактуры

Тег 4: Итого по счету-фактуре

Тег 5: Итого по налогу

Тег 6: Хэш счета в формате XML

Тег 7: Подпись ECDSA

Тег 8: Открытый ключ ECDSA

Тег 9: ECDSA-подпись открытого ключа криптографической метки.

Что я здесь делаю не так и как правильно это исправить?

0
Taha Khan 11 Окт 2021 в 19:05

2 ответа

Лучший ответ

Зная это двоичные данные, мы можем повторить их с помощью bin2hex(base64_decode($base64)) и увидеть следующее:

0109313233343536373839020a31322f31322f323032300304313030300303313530f6889f66768e0e95a96bd657a22b6593732c5ef1bd9ad65d6e71455e72158db116ed327173a2caa57493b5ac87a6f521c1364dfcdaa7501001056c92d9acbf514543533120000000629b945321f671514a7f2dbdfb57aa8f73452cf654400f213499dd6ed40c72a1531fbbc971a28cbb4949919730e73e8e92b0011cc397af069a645def935674eb

Для облегчения просмотра я использовал инструменты командной строки base64 -d и xxd, чтобы получить это представление:

00000000: 0109 3132 3334 3536 3738 3902 0a31 322f  ..123456789..12/
00000010: 3132 2f32 3032 3003 0431 3030 3003 0331  12/2020..1000..1
00000020: 3530 f688 9f66 768e 0e95 a96b d657 a22b  50...fv....k.W.+
00000030: 6593 732c 5ef1 bd9a d65d 6e71 455e 7215  e.s,^....]nqE^r.
00000040: 8db1 16ed 3271 73a2 caa5 7493 b5ac 87a6  ....2qs...t.....
00000050: f521 c136 4dfc daa7 5010 0105 6c92 d9ac  .!.6M...P...l...
00000060: bf51 4543 5331 2000 0000 629b 9453 21f6  .QECS1 ...b..S!.
00000070: 7151 4a7f 2dbd fb57 aa8f 7345 2cf6 5440  qQJ.-..W..sE,.T@
00000080: 0f21 3499 dd6e d40c 72a1 531f bbc9 71a2  .!4..n..r.S...q.
00000090: 8cbb 4949 9197 30e7 3e8e 92b0 011c c397  ..II..0.>.......
000000a0: af06 9a64 5def 9356 74eb                 ...d]..Vt.

Вы не объяснили возможные значения «тегов», но я вижу, что начало этой строки имеет тег 0x01, длину 0x09, а следующие 9 байтов - это ASCII / UTF-8 для 123456789; затем он имеет тег 0x02, длину 0x0a, а следующие 10 символов - это ASCII / UTF-8 12/12/2020; и так далее.

Позже есть тег f6 с длиной 88 и некоторые двоичные данные, но, не зная, что означает тег f6, у меня нет причин предполагать, что это проблема - возможно, он включает изображение или поток сжатых данных.

4
IMSoP 11 Окт 2021 в 16:16

Отредактировано:

В

flaxon 11 Окт 2021 в 16:36