所以,我以前也问过类似的问题,但这个问题后来发生了变化。所以,我会给你一个完整的概述,然后我会问这个问题。
目前,我正在读取一个.yml文件并对其进行解析。然后,我将数据存储在HashMap<字符串,数组列表>看起来像这样:
[{p_table=[p_event/Name, p_fault/Name]},
{s_table=[s_event/Name, s_fault/Name]},
{r_table=[r_event/Name, r_fault/Name]}]
现在,我明白了,如果我想创建一个带有bouncycastle的扩展,我首先必须将所有数据添加到ASN1CencodableVector中。我正在做的是使用证书来告诉我的物联网事物,它们可以订阅/发布/接收哪些主题。因此,我可以做这样的事情:
while(iterator.hasNext()) {
Entry<String, ArrayList<String>> entry = iterator.next();
ASN1EncodableVector vector = new ASN1EncodableVector
for(String val : entry.getValue()) {
(vector).add(new DERUTF8String(val));
}
allowedTables.add(new DERSequence(vector));
}
这只会添加arraylist中的值,例如p_event/Name或p_fault/Name,我有没有办法指定这两个DERUTF8String属于p_table?或者,在使用.add方法时,是否可以使用某种标识符?
那么代码可能会从这样的东西改变吗:
(vector).add(new DERUTF8String(val));
至:
(vector).add(new aConstructorToIdentifyWhatTheUTF8BelongsTo(entry.getKey()), new DERUTF8String(val));
您可以嵌套序列,也就是说,您可以为每个条目构建一个DERSequence,然后将它们中的每个添加到外部ASN1CencodableVector中,并由此生成最终序列。如果值的数量固定为2,则内部序列可能包含key/val/val,如您的示例所示。或者,您可以使用另一个序列来保存值,例如:
SEQUENCE {
SEQUENCE {
"p_table",
SEQUENCE {
"p_event/Name",
"p_fault/Name",
}
},
SEQUENCE {
"s_table",
SEQUENCE {
"s_event/Name",
"s_fault/Name",
"s_other/Name",
}
},
// and so on
}