Найти и заменить (увеличить) шестнадцатеричное значение ASN.1 BER
У меня есть длинная строка шестнадцатеричного (преобразовано из BER ASN.1), где мне нужно найти и увеличить конкретное значение, которое является неправильным.
<TAG> <LENGTH> <VALUE to INCREMENT>
тег ASN.1 равен 84, а длина байта изменится с 01 на 02, когда value > 127dec
, И, следовательно, значение приращения станет 2 байта.
Значение должно начинаться с 00.
например
- Original file: ...840101...840107...84020085...84020097
- New file: ...840100...840101...84020080...84020081
Любые идеи, как лучше всего это сделать, желательно с использованием стандартных команд Bash?
2 ответа
Илья Этингоф уже намекал на это, но, чтобы быть откровенным, BER использует кодировку TAG, LENGTH, VALUE (TLV), где VALUE сама может быть TLV. Если вы измените длину в TLV, который вложен в TLV, вам также потребуется обновить все длины вмещающих TLV. Это не простая операция поиска / замены.
Предполагая, что у вас уже есть поток октетов в текстовой работе, вы можете рассмотреть возможность поиска / замены фрагментов текста на awk
или же sed
, Если вы можете использовать только bash
, может быть переменная подстановка (${parameter/pattern/string}
или же ${parameter:offset:length}
) должно сработать?
Имейте в виду, однако, что BER является достаточно гибким в том смысле, что (иногда) одна и та же структура данных может кодироваться по-разному, и это все равно будет представлять собой действительное кодирование. Обоснование этого заключается в том, чтобы позволить кодировщику оптимизировать работу в соответствии с его собственной ситуацией (например, экономить память или циклы ЦП, копирование и т. Д.).
Что я пытаюсь сказать, что в зависимости от вашей ситуации может быть шанс, что ваша логика поиска / замены может дать сбой. Пуленепробиваемым решением было бы полностью декодировать ваш поток октетов BER, изменить необходимую структуру данных и перекодировать ее обратно в BER.