这是来自某个 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,