Cyr Опубликовано 22 апреля, 2014 · Жалоба Здравствуйте. Пишу скриптик декодирующий сообщения от АТС. Попался мне участок одного сообщение которое никак не хочет распарсиваться. use strict; use warnings; use diagnostics; use Convert::ASN1; use Data::Dumper; my $pdu ="A1 40 30 27 A0 1B 6B 19 30 17 80 04 30 30 38 41 A1 0F 30 0D 80 0B 38 39 35 31 39 39 39 39 39 39 39 A3 08 30 06 81 04 01 31 00 11 30 15 A0 13 6B 11 30 0F 80 04 30 30 38 41 A1 07 30 05 80 03 31 32 36"; $pdu =~s/\s//g; # убираем пробелы $pdu =pack ("H*", $pdu); # превращаем строку в бинарник Convert::ASN1::asn_dump($pdu); # parse ASN.1 desciptions my $asn = Convert::ASN1->new; $asn->prepare(<<ASN1) or die "prepare: ", $asn->error; TransferredEvent ::= SEQUENCE { -- primaryOldCall ConnectionID, -- secondaryOldCall [0] IMPLICIT ConnectionID OPTIONAL, -- transferringDevice SubjectDeviceID, -- transferredToDevice SubjectDeviceID, transferredConnections [1] IMPLICIT ConnectionList -- localConnectionInfo LocalConnectionState OPTIONAL, -- correlatorData [2] IMPLICIT CorrelatorData OPTIONAL, -- userData UserData OPTIONAL, -- chargingInfo [3] IMPLICIT ChargingInfo OPTIONAL, -- cause EventCause -- servicesPermitted [4] IMPLICIT ServicesPermitted OPTIONAL, -- mediaCallCharacteristics [5] IMPLICIT MediaCallCharacteristics OPTIONAL, -- callCharacteristics [6] IMPLICIT CallCharacteristics OPTIONAL, -- callLinkageDataList [7] IMPLICIT CallLinkageDataList OPTIONAL, -- extensions CSTACommonArguments OPTIONAL } ConnectionID ::= [APPLICATION 11] CHOICE { callID [0] IMPLICIT CallID, deviceID [1] LocalDeviceID, both SEQUENCE { callID [0] IMPLICIT CallID, deviceID [1] LocalDeviceID } } CallID ::= OCTET STRING LocalDeviceID ::= CHOICE { staticID DeviceID, dynamicID [3] IMPLICIT OCTET STRING } DeviceID ::= SEQUENCE { deviceIdentifier CHOICE { dialingNumber [0] IMPLICIT NumberDigits, deviceNumber [1] IMPLICIT DeviceNumber -- implicitPublic [2] IMPLICIT NumberDigits, -- explicitPublic [3] PublicTON, -- implicitPrivate [4] IMPLICIT NumberDigits, -- explicitPrivate [5] PrivateTON, -- other [6] IMPLICIT OtherPlan } } NumberDigits ::= IA5String DeviceNumber ::= INTEGER SubjectDeviceID ::= [APPLICATION 3] CHOICE {deviceIdentifier DeviceID, notKnown [7] IMPLICIT NULL} ConnectionList ::= SEQUENCE OF SEQUENCE { newConnection [0] ConnectionID OPTIONAL, -- oldConnection [1] ConnectionID OPTIONAL, -- endpoint [2] CHOICE -- { deviceID DeviceID, -- notKnown NULL} OPTIONAL, associatedNID [3] CHOICE { deviceID DeviceID, notKnown NULL} -- должно быть OPTIONAL, но компилятору не нра -- resultingConnectionInfo ConnectionInformation OPTIONAL } ASN1 my $obj = $asn->find('TransferredEvent'); my $out = $obj->decode($pdu) or die $asn->error; $Data::Dumper::Indent=1; $Data::Dumper::Pair=' '; $Data::Dumper::Quotekeys=0; print Dumper($out); грамматика взята из Ecma-285.asn должно получиться вот это: transferredConnections[0] { newConnection { both { callID = 30303841 deviceID { staticID { deviceIdentifier { dialingNumber = 89519999999 } } } } } associatedNID { deviceID { deviceIdentifier { deviceNumber = 19988497 } } } } transferredConnections[1] { newConnection { both { callID = 30303841 deviceID { staticID { deviceIdentifier { dialingNumber = 126 } } } } } } Помогите, кто разбирается. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...