【问题标题】:Find and replace (increment) ASN.1 BER hex value查找和替换(增加)ASN.1 BER 十六进制值
【发布时间】:2017-12-19 12:05:58
【问题描述】:

我有一个很长的十六进制字符串(从 BER ASN.1 转换而来),我需要在其中查找并增加一个不正确的特定值。

<TAG> <LENGTH> <VALUE to INCREMENT>

value &gt; 127dec 时,ASN.1 标记为 84,长度字节将从 01 变为 02。因此,要增加的值将变为 2 个字节。

值应该从 00 开始。

例如

- Original file: ...840101...840107...84020085...84020097
- New file:      ...840100...840101...84020080...84020081

任何想法如何最好地做到这一点,最好使用标准 bash 命令?

【问题讨论】:

标签: bash hex asn.1 ber


【解决方案1】:

Ilya Etingof 已经暗示过这一点,但要明确一点,BER 使用 TAG、LENGTH、VALUE (TLV) 编码,其中 VALUE 本身可以是 TLV。如果更改嵌套在 TLV 中的 TLV 的长度,则还需要更新封闭 TLV 的所有长度。这不是一个简单的搜索/替换操作。

【讨论】:

    【解决方案2】:

    假设您已经在文本工作中拥有八位字节流,您可以考虑使用awksed 搜索/替换文本片段。如果只能使用bash,可能变量替换(${parameter/pattern/string}${parameter:offset:length})会起作用吗?

    但请记住,BER 非常灵活,因为(有时)相同的数据结构可能会以不同的方式编码,但仍会构成有效的编码。其背后的基本原理是允许编码器针对自己的情况进行优化(例如,节省内存或 CPU 周期或复制等)。

    我想说的是,根据您的情况,您的搜索/替换逻辑可能会失败。防弹解决方案是完全解码您的 BER 八位字节流,更改您需要的数据结构并将其重新编码回 BER。

    【讨论】:

    • 感谢这一点,并指出搜索/替换逻辑可能会失败,但从我的角度来看,这似乎是最简单的,因为不熟悉 BER 编码/解码。我一直在尝试 awk / sed 但未能找到正确的方法来让它工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2020-12-07
    • 2010-10-05
    • 2019-12-11
    • 1970-01-01
    • 2018-07-16
    相关资源
    最近更新 更多