Анализ файла DAT с помощью надувного замка

#java #exception #bouncycastle #asn.1 #decoder

Вопрос:

Он dat file извлекается. В нем содержится много данных. Однако некоторые данные публикуются без проблем, в то время как другие указывают на ошибки.

Вот мой код

 public void Decode(File filePath) {
        byte[] blockBuffer = new byte[0x800];
        ASN1InputStream bIn;
        ASN1Primitive obj;
        try {
            FileInputStream fileInput = new FileInputStream(filePath);
            notFound = false;
            String checkFileSql = "SELECT count(*) AS cnt FROM table_name WHERE filename=?";
            PreparedStatement checkStmt = conn.prepareStatement(checkFileSql);
            checkStmt.setString(1, filePath.getName());
            ResultSet rs = checkStmt.executeQuery();
            if (rs.next()) {
                if (rs.getInt("cnt") == 0) {
                    isExist = false;
                    String insertSql = "INSERT..."
                    stmt = conn.prepareStatement(insertSql);
                    while (fileInput.available() > 0) {
                        if (fileInput.read(blockBuffer) > 0) {
                            bIn = new ASN1InputStream(blockBuffer);
                            boolean endOfBlock = false;
                            while (bIn.available() > 4 amp;amp; !endOfBlock) {
                                if (bIn.markSupported()) {
                                    bIn.mark(4);
                                    if (bIn.read() == 0xff amp;amp; bIn.read() == 0xff amp;amp; bIn.read() == 0xff
                                            amp;amp; bIn.read() == 0xff) {
                                        endOfBlock = true;
                                    }
                                    bIn.reset();
                                    if (!endOfBlock) {
                                        obj = (ASN1Primitive) bIn.readObject();
                                        Record cr = new Record();
                                        cr.parseObject(obj);
                                        if (cr.cdrType != null) {
                                            if (cr.cdrType == cr.pgwCDR || cr.cdrType == cr.sgwCDR) {
                                            }
                                        }

                                    }
                                }
                            }
                        }
                    }

                    int[] rslt = stmt.executeBatch();

                    for (int i = 0; i < rslt.length; i  ) {
                        inserted  = rslt[i];
                    }

                    conn.commit();

                    stmt.close();
                    fileInput.close();
                } else {
                    isExist = true;
                }
            }
            rs.close();
            checkStmt.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            exceptionStr = e.getMessage();
            e.printStackTrace();
        }
    }
 

Сообщение об ошибке

Ява.Ио.EOFException: длина деф объект 224 усе на 90 в орг.после установки BouncyCastle.является asn1.DefiniteLengthInputStream.читать(неизвестный источник) на орг.после установки BouncyCastle.утиль.Ио.Потоки.readFully(неизвестный источник) на орг.после установки BouncyCastle.утиль.Ио.Потоки.readFully(неизвестный источник) на орг.после установки BouncyCastle.является asn1.DefiniteLengthInputStream.toByteArray(неизвестный источник) на орг.после установки BouncyCastle.является asn1.ASN1StreamParser.readTaggedObject(неизвестный источник) на орг.после установки BouncyCastle.является asn1.BERTaggedObjectParser.getLoadedObject(неизвестный источник) на орг.после установки BouncyCastle.является asn1.ASN1StreamParser.readVector(неизвестный источник) на орг.bouncycastle.asn1.ASN1StreamParser.readTaggedObject(Неизвестный источник) в org.bouncycastle.asn1.ASN1InputStream.buildObject(Неизвестный источник) в org.bouncycastle.asn1.ASN1InputStream.readObject(Неизвестный источник)

Вот анализ кода данных

 public void parseObject(ASN1Primitive obj) {
        if (obj instanceof DERTaggedObject) {
         DERTaggedObject.getInstance(obj);
            DERTaggedObject cdrObj = (DERTaggedObject) DERTaggedObject.getInstance(obj);
            cdrType = cdrObj.getTagNo();
            if (cdrObj.getObject() instanceof DLSequence) {
                DLSequence callModule = (DLSequence) DLSequence.getInstance(cdrObj.getObject());
                for (int i = 0; i < callModule.size(); i  ) {
                    if (callModule.getObjectAt(i) instanceof DERTaggedObject) {
                        DERTaggedObject eventModule = (DERTaggedObject) DERTaggedObject
                                .getInstance(callModule.getObjectAt(i));
                        int tag = eventModule.getTagNo();
                        distValues(cdrType, tag, eventModule);
                    }
                }
            }
        }
    }
 

Строка, указывающая на сообщение об ошибке

 obj = (ASN1Primitive) bIn.readObject();

            
 

Комментарии:

1. Пожалуйста, опубликуйте полную трассировку стека

2. Мы не знаем, что в файле и что вы пытаетесь сделать. В любом случае, я не понимаю , как этот код может выполняться там, где вы утверждаете, потому ASN1InputStream что не поддерживает mark() , поэтому bIn.markSupported() всегда будет возвращать false.