从嵌套元组获取值



这是来自某个 Erlang 库的嵌套元组:

tuple = {:Certificate,
          {:TBSCertificate,
           :v3,
           3464270192823392628,
           {:AlgorithmIdentifier, {1, 2, 840, 113549, 1, 1, 11}, <<5, 0>>},
           {:Validity, {:utcTime, '160428162930Z'}, {:utcTime, '170528162930Z'}},
           :asn1_NOVALUE,
           :asn1_NOVALUE,
           :asn1_NOVALUE,
           :asn1_NOVALUE,
           :asn1_NOVALUE}}

为了找到:Validity元组,我需要做

tuple |> elem(1) |> elem(4)

我可以进行模式匹配,:asn1_NOVALUE但是结束我只想忽略他们。

在 Erlang/Elixir 中还有其他方法可以获取嵌套元组值吗?类似的东西

get_in(tuple, [:Certificate, :Validity])

我在这里找到了记录的定义'TBSCertificate'

'TBSCertificate'{
      version,              % v1 | v2 | v3 
      serialNumber,         % integer() 
      signature,            % #'AlgorithmIdentifier'{} 
      issuer,               % {rdnSequence, [#AttributeTypeAndValue'{}]} 
      validity,             % #'Validity'{}
      subject,              % {rdnSequence, [#AttributeTypeAndValue'{}]} 
      subjectPublicKeyInfo, % #'SubjectPublicKeyInfo'{}
      issuerUniqueID,       % binary() | asn1_novalue
      subjectUniqueID,      % binary() | asn1_novalue
      extensions            % [#'Extension'{}] 
     }.

它是erlang符号,但我想它会等同于长生不老药。在 erlang 中,您可以使用记录语法检索'Validity'的信息:

{_,TBScert} = Tuple,
Validity = Tuple#'TBSCertificate'.'Validity' % which is also a record

我不熟悉 elixir 的语法,我认为它是这样的

{_,tbs_cert} = tuple,
validity = :TBSCertificate(tbs_cert, :Validity),

但我无法测试它。'Validity'记录的定义是:

'Validity'{ 
      notBefore, % time()
      notAfter   % time()
     }.

我会做这样的事情:

with {:Certificate, cert} <- tuple,
     [_, _, _, _, {:Validity, v1, v2} | _] <- Tuple.to_list(cert),
do: {v1, v2}
%⇒ {{:utcTime, '160428162930Z'}, {:utcTime, '170528162930Z'}}

您可以从public_key.hrl中提取记录信息

require Record
Record.defrecord :certificate Record.extract(:Certificate, from_lib: "public_key/include/public_key.hrl")
Record.defrecord :TBSCertificate Record.extract(:TBSCertificate, from_lib: "public_key/include/public_key.hrl")
Record.defrecord :validity Record.extract(:Validity, from_lib: "public_key/include/public_key.hrl")

然后你可以写模式匹配

certificate(tbsCertificate: TBSCert) = Tuple,
TBSCertificate(Validity: valid) = TBSCert,
validity(notBefore: from, notAfter: to) = valid,

我对长生不老药的了解不足以知道这是否也有效

certificate(tbsCertificate: TBSCertificate(Validity: validity(notBefore: from, notAfter: to))) = Tuple,

最新更新