Невозможно найти решение на этой странице, которое не работает
Вот решение, которое не имеет недостатков выше (никаких обещаний у меня нет других недостатков)
import java.math.BigInteger;
import static java.lang.System.out;
public final class App2 {
// | proposed solution.
public static String encode(byte[] bytes) {
final int length = bytes.length;
// | BigInteger constructor throws if it is given an empty array.
if (length == 0) {
return "00";
}
final int evenLength = (int)(2 * Math.ceil(length / 2.0));
final String format = "%0" + evenLength + "x";
final String result = String.format (format, new BigInteger(bytes));
return result;
}
public static void main(String[] args) throws Exception {
// 00
out.println(encode(new byte[] {}));
// 01
out.println(encode(new byte[] {1}));
//203040
out.println(encode(new byte[] {0x20, 0x30, 0x40}));
// 416c6c20796f75722062617365206172652062656c6f6e6720746f2075732e
out.println(encode("All your base are belong to us.".getBytes()));
}
}
Я не мог получить это под 62 кодами операций, но если вы можете жить без 0 дополнений, если первый байт меньше 0x10, тогда следующее решение использует только 23 кода операций. На самом деле показывает, как «простые для реализации» решения, такие как «pad с нулевым значением, если длина строки нечетна», могут стать довольно дорогими, если собственная реализация еще не доступна (или в этом случае, если BigInteger имел возможность префикса с нулями в toString).
public static String encode(byte[] bytes) {
final int length = bytes.length;
// | BigInteger constructor throws if it is given an empty array.
if (length == 0) {
return "00";
}
return new BigInteger(bytes).toString(16);
}