Java Серийное чтение \ как удалить? - PullRequest
0 голосов
/ 23 марта 2020

Я использую RFID-считыватель ID-12LA и библиотеку для Java RxTx.

Загрузка данных из считывателя, но данные: "\ u000267009CB3541 C"

Как удалить \ u0002? Идентификатор карты - 67009CB3541C. System.out.print - 67009CB3541 C

        BufferedReader input = new BufferedReader(new InputStreamReader(port.getInputStream()));
                        port.addEventListener(event -> {
                            if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
                                try {
                                    String inputLine = input.readLine();
                                    inputLine.replace("\"\\u0002\"", "");

                                    System.out.println("Read data: " + inputLine);
}
catch (IOException | URISyntaxException e) {
                            System.err.println(e.toString());

                        }

    });

Мне нужно получить строку, представляющую код карты. Мне нужен считыватель номера карты, а затем разрешить доступ.

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Я не знаю протокол, используемый этим RFID-ридером, но похоже, что использовать java .io.Reader небезопасно. Если вы читаете необработанные байты в строку, вы рискуете повредить данные, когда они кодируются с использованием кодировки.

Похоже, что устройство отправляет ответный байт (в данном случае 02), за которым следуют байты ASCII, представляющие идентификатор карты. Поэтому избегайте использования InputStreamReader; вместо этого читайте первый байт, затем читайте байты, пока не встретите символ новой строки и не преобразуйте их в строку. ( Не опускать кодировку при преобразовании - вы не хотите полагаться на кодировку системы по умолчанию!)

InputStream input = port.getInputStream();

int code = input.read();
if (code != 2) {
    throw new IOException("Reader did not return expected code 2.");
}

ByteArrayOutputStream idBuffer = new ByteArrayOutputStream();
int b;
while ((b = input.read()) >= 0 && b != '\r' && b != '\n') {
    idBuffer.write(b);
}

String cardID = idBuffer.toString(StandardCharsets.UTF_8);
0 голосов
/ 23 марта 2020

Тогда вы действительно можете заменить его следующим образом:

inputLine = inputLine.replace("\u0002", "");

Обратите внимание на синтаксис \ u0002, представляющий один символ.

или, если вы уверены, что это всегда первый символ :

inputLine = inputLine.substring(1);
...