查找并替换(增量)ASN.1 BER十六进制值

时间:2017-12-19 12:05:59

标签: bash hex asn.1 ber

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

@Service
@Order(3)
public class EvaluateExampleWithConstructor implements Interface {

private LocalDate busDate;

@Autowired
public EvaluateExampleWithConstructor(LocalDate busDate) {
    this.busDate = busDate;
}

ASN.1标记为84,当<TAG> <LENGTH> <VALUE to INCREMENT> 时,长度字节将从01变为02。因此,增量值将变为2个字节。

该值应从00开始。

e.g。

value > 127dec

如何最好地使用标准bash命令?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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