Perl Convert::ASN1解码错误

Perl Convert::ASN1解码错误,perl,asn.1,Perl,Asn.1,我一定错过了一些很明显的东西。我可以使用在线工具(如)解码此示例数据位,但在基本使用Perl的Convert::ASN1时遇到了问题。知道我错过了什么吗 严格使用; 使用警告; 使用Convert::ASN1; 使用特征“说”; 示例来自: http://www.oss.com/asn1/resources/asn1-made-simple/introduction.html 我的$hex_数据='3018800A4A6F686E20536D69746810A393833635343332313

我一定错过了一些很明显的东西。我可以使用在线工具(如)解码此示例数据位,但在基本使用Perl的Convert::ASN1时遇到了问题。知道我错过了什么吗

严格使用; 使用警告; 使用Convert::ASN1; 使用特征“说”; 示例来自: http://www.oss.com/asn1/resources/asn1-made-simple/introduction.html 我的$hex_数据='3018800A4A6F686E20536D69746810A3938336353433323130'; my$bin_data=join,pack'H*,$hex_data; 转换::ASN1::asn_转储$bin_数据; 印刷品: 0000 24:顺序{ 0002 10:[上下文0] 0004:4A 6F 68 6E 20 53 6D 69 74 68约翰·史密斯 000E 10:[上下文1] 0010 : 39 38 37 36 35 34 33 32 31 30 __ __ __ __ __ __ 9876543210 001A:} my$asn=转换::ASN1->新建; $asn->准备查找“联系人” 或死$asn->错误; my$payload=$asn1\u节点->解码$bin\u数据 或骰子无法解码联系人:.$asn1\U节点->错误; 印刷品: 无法解码联系人:解码错误801a 2 4姓名 支持YaFred下面的答案,这就是80和81在编码字符串中的位置:

SEQ length=24 ** l=10  J  o  h n   S m i t h  ** l=10  9 8 7 6 5 4 3 2 1 0
30  18        80 0A    4A 6F 686E20536D697468 81 0A    39383736353433323130

我不确定您的十六进制字符串是从哪里来的……但是如果您使用Convert::ASN1::encode方法,您会得到一个稍微不同的十六进制字符串,可以正确解码:

my $res = $asn->encode({ name => 'John Smith', phone => 9876543210 });
my $res_hex = unpack 'H*', $res;
print "res_hex after encode : $res_hex\n";
print "original hex_data    : " . lc($hex_data) . "\n";
print "\n";

my payload = $asn1_node->decode($res) or die $asn1_node->error;
use Data::Dumper;
print Dumper($payload);
输出


也许这和

$asn->prepare(<<ASN1) or die $asn->error; 
My-Module DEFINITIONS AUTOMATIC TAGS ::=
BEGIN   
        Contact ::= SEQUENCE {
            name VisibleString,
            phone NumericString
        }
END
    ASN1
如果你从ASN.1开始解释有点长

您没有为标记上下文提供类型联系人应该是模块的一部分。所以,工具正在做出选择

您显示的hexa是使用自动标记编码的结果

这两个字符串的标记分别为“80”上下文标记0=1000 0000和“81”上下文标记1=1000 0001

@xxfelixxx得到了一些不同的东西,因为编码是作为显式标记执行的


这两个字符串的标记是VisibleString的'1a'通用标记和NumericString的'12'通用标记

Perl模块实际上不支持这些额外的行,但这就是发生的事情,是的。我将用一些额外的信息来更新这个问题,显示80和81在字符串中的位置。这很遗憾。您可以用另一种方式解决问题,并用模块定义围绕类型::=开始和结束,以使oss.com生成perl模块应该理解的编码。
$asn->prepare(<<ASN1) or die $asn->error; 
My-Module DEFINITIONS AUTOMATIC TAGS ::=
BEGIN   
        Contact ::= SEQUENCE {
            name VisibleString,
            phone NumericString
        }
END
    ASN1