Skip to content
This repository was archived by the owner on Feb 21, 2026. It is now read-only.
This repository was archived by the owner on Feb 21, 2026. It is now read-only.

ERROR net.devbase.jfreesteel.EidCard - Card error #8

@nikola-lukic

Description

@nikola-lukic

Prilikom čitanja "novih" kartica dolazilo je do sledeće greške (sama aplikacija je u GUI izbacivala null):

[Thread-1] ERROR net.devbase.jfreesteel.EidCard - Card error
java.nio.BufferUnderflowException
	at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:151)
	at java.nio.ByteBuffer.get(ByteBuffer.java:715)
	at net.devbase.jfreesteel.EidCard.parseTlv(EidCard.java:143)
	at net.devbase.jfreesteel.EidCard.readEidInfo(EidCard.java:297)
	at net.devbase.jfreesteel.viewer.EidViewer.inserted(EidViewer.java:265)
	at net.devbase.jfreesteel.Reader.notifyCardListener(Reader.java:210)
	at net.devbase.jfreesteel.Reader.access$500(Reader.java:45)
	at net.devbase.jfreesteel.Reader$1.notifyListeners(Reader.java:176)
	at net.devbase.jfreesteel.Reader$1.run(Reader.java:156)
	at java.lang.Thread.run(Thread.java:748)

Problem je u okviru klase EidCard (package net.devbase.jfreesteel) u izvršavanju metode public static Map<Integer, byte[]> parseTlv(final byte[] bytes). Prilikom čitanja "novih" kartice dolazilo je do toga da pokuša da pročita više podataka nego što u bufferu postoji.
Moram prizanti da ne poznajem strukturu iščitavanja, ali sam code pomenute metode malo promenio i iščitavanje je bilo uspešno i sa "novim" karticama.
Ovo je izgled promenjene metode:

public static Map<Integer, byte[]> parseTlv(final byte[] bytes) {
        HashMap<Integer, byte[]> out = new HashMap<Integer, byte[]>();

        // [fld 16bit LE] [len 16bit LE] [len bytes of data] | [fld] [06] ...

        ByteBuffer buffer = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN);

        // repeat as long as we have next tag and len...
        while (buffer.remaining() > 4) {
            char tag = buffer.getChar();
            char length = buffer.getChar();
            //pocetak izmenjenog dela u odnosu na originalni kod
            byte[] range;
            if (buffer.remaining()>(int)length){
                range = new byte[(int) length];
            } else {
                range = new byte[buffer.remaining()];
            }
            //kraj izmenjenog dela u odnosu na originalni kod
            buffer.get(range);
            out.put((int) tag, range);
        }

        return out;
    }

Možda nije najsrećnije rešenje ali je odradilo posao :)

Inače, u jednom trenutku prilikom čitanja u length se upisuje vrednost veća od 1000, a ukupna veličina bafera je reda 250 (u tom trenutku je preostalo negde oko 130 byte-ova za čitanje).

Napomena: Ovo sam probao sa jednom "starom" ličnom karticom i dve "nove".

Nisam neki guru u programiranju, poznajem osnove, te smatram da ćeš možda dati neko drugo rešenje, a nadam se da će uskoro nova verzija (*.deb bar) sa sređenim bug-om.

Svako dobro!!!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions