我有一个asn.1文件,其内容未知,因为我无法正确阅读。 我在stackoverflow中找到了一些答案,但我对此有一些疑问。
public static void main(String[] args) throws IOException {
ASN1InputStream ais = new ASN1InputStream( new FileInputStream(new File("asnfile")));
while (ais.available() > 0){
DERObject obj = ais.readObject();
System.out.println(ASN1Dump.dumpAsString(obj, true));
//System.out.println(CustomTreeNode.dumpAsString(obj));
}
ais.close();
}
代码的输出如下所示:
> 00
> Tagged [0] IMPLICIT
> DER Sequence
> Tagged [0] IMPLICIT
> DER Octet String[1]
> 00
> Tagged [1] IMPLICIT
> DER Octet String[8]
> 15051312215238f6 !R8
> Tagged [2] IMPLICIT
> DER Octet String[8]
> 53968510617268f0 Sarh
> Tagged [3] IMPLICIT
我认为这不是实际格式。如何读取文件以及在项目中添加以读取文件所需的jar文件。
答案 0 :(得分:2)
您似乎正在使用Bouncy Castle ASN1阅读课程。这是一个备受推崇的图书馆;它不太可能产生错误的答案。所以,似乎你的问题的答案是你已经在使用正确的工具。为什么你找不到一个只在Java之外转储ASN.1文件并将结果与之比较的工具。
答案 1 :(得分:-1)
你有一个编码流的字符串转储,只需使用下面的鳕鱼片(我没有根据你的答案改变,只需了解下面的代码,然后就可以了)
在编写此代码时,我每次都使用读取2048流的块
ASN1InputStream bIn = null;
Object decodedObj = null;
while ((len = inputStream.read(buf, 0, size)) != -1) { // Read 2Kb Block
bIn = new ASN1InputStream(buf); // Passing buffer
try{
while( (decodedObj = bIn.readObject()) != null){ // Read each record in the Block.
decode(decodedObj);
}
}//try block
catch (Exception e){
//e.printStackTrace();
//logger.error("Got an error while dividing inputStream because of filler bytes :"+e.getMessage());
}
}
将方法内容解码为休闲
void decode(Object obj){
ASN1Primitive primObj = null;
if(obj instanceof ASN1TaggedObject)
{
mapDecodedMsgValues = new HashMap<String,String>();
msgTag = ((ASN1TaggedObject)obj).getTagNo() ;
switch (msgTag)
{
case ABC_EVENT: // you can keep required tag number
primObj = ((DERTaggedObject)obj).getObject();
if (primObj instanceof ASN1Sequence)
{
ASN1Sequence obj = (ASN1Sequence)primObj;
ASN1Encodable imsi_asn1Enc = obj.getObjectAt(IMSI_INDEX); // write which index value you want
ASN1Primitive imsi_asn1Prim = imsi_asn1Enc.toASN1Primitive();
ASN1OctetString imsi_OS = (ASN1OctetString) ((ASN1TaggedObject)imsi_asn1Prim).getObject(); //According to spec is OCTETString
raw_imsi = imsi_OS.toString();
}
}
}
其中raw_imsi变量将给出解码的特定索引数据