Декодирование и кодирование в Base45 на Java

#java #encoding #base45

Вопрос:

Я с большим интересом слежу за проектом цифрового сертификата covid на java: https://github.com/ehn-dcc-development/

Более конкретно, для Java и для декодирования пропуска: https://github.com/GaetanoPiazzolla/greenpass-decode

Используя этот код, для декодирования строки base45, которую мы считываем с QR-кода, у нас есть:

 byte[] bytecompressed = Base45.getDecoder().decode(withoutPrefix);
 

Я хотел бы закодировать ту же самую строку обратно, поэтому я пытаюсь сделать следующее:

 byte[] byteCompressedNew = Base45.getEncoder().encode(bytecompressed);
 

Но это приводит к следующей ошибке:

Исключение в потоке «основной» java.lang.Исключение ArrayIndexOutOfBoundsException: индекс -23 выходит за рамки длины 45 при nl.minvws.кодировке.Base45$Кодировщик.кодирование(Base45.java:74)

В этой строке кода в модуле base45:

 result[resultIndex  ] = toBase45[value % 45];
 

Было бы здорово, если бы вы помогли мне понять, что я делаю не так.

Большое спасибо!

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

1. Откуда это Base45 берется? ... Понял: github.com/ehn-dcc-development/base45-java/blob/master/src/main/…

2. Я не заглядывал в связанный код, но значение байта подписано -128 до 127. И -23 % 45 = -23. Это должно было быть 45-23 = 22. Добавление 256 к отрицательным числам.

3. @JoopEggen Похоже, что для этого уже есть проблема с GitHub? github.com/ehn-dcc-development/base45-java/issues/2

Ответ №1:

Вам необходимо обновить свою зависимость с версии 0.0.2 до 0.0.3 (выпущена 6 апреля 2021 года с исправлением ошибки именно для этой проблемы).

 io.github.ehn-digital-green-development:base45:0.0.3
 

Для maven:

 <dependency>
  <groupId>io.github.ehn-digital-green-development</groupId>
  <artifactId>base45</artifactId>
  <version>0.0.3</version>
</dependency>