Важно понимать, что нет разницы между подписанными и неподписанными байтами в отношении их представления. Подпись - это то, как байты обрабатываются арифметическими операциями (кроме сложения и вычитания, в случае представления дополнения 2).
Итак, если вы используете byte
s для хранения данных, все, что вам нужно, это убедиться, что вы обрабатываете их как беззнаковые при преобразовании значений в byte
s (используйте явное приведение с (byte)
, точка 1) и от byte
с (запретить расширение знака с помощью & 0xff
, точка 2):
public static void main(String[] args) throws Exception {
byte[] in = { (byte) 0xff }; // (1)
byte[] hash = MessageDigest.getInstance("SHA-1").digest(in);
System.out.println(toHexString(hash));
}
private static String toHexString(byte[] in) {
StringBuilder out = new StringBuilder(in.length * 2);
for (byte b: in)
out.append(String.format("%02X", b & 0xff)); // (2)
return out.toString();
}