Два первых байта в строке: поведение преобразования? - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть байтовый массив, который является хешем файла. Это сделано с messageDigest, так что есть отступы. Затем я делаю короткое замыкание, которое представляет собой два первых байта хэша, например:

 byte[] shorthash = new byte[2];
 System.arraycopy(hash, 0, shortHash, 0, 2);

Чтобы сделать его читаемым для пользователя и сохранить его в БД, я конвертирую его в строку с Base64 Encoder:

Base64.getUrlEncoder().encodeToString(hash); //Same for shorthash

Что я не понимаю, так это:

  1. Почему строка, представляющая мои короткие четыре символа длиной? Я думал, что символ - это один или два байта, поэтому, поскольку я копирую только два байта, у меня не должно быть больше двух символов, верно?

  2. Почему моя короткая строка не совпадает с началом строки хеша?

Например, у меня будет:

Hash: LE5D8vCsMp3Lcf-RBwBRbO1v4soGq7BBZ9kB_2SJnGY=
Shorthash: Rak=

Вы можете увидеть = в конце каждого; это, конечно, исходит от заполнения MessageDigest, так что это нормально для хэша, но почему для короткого кода? Это должны быть два ПЕРВЫХ байта, а = в конце!

Более того: поскольку я хотел избавиться от этого отступа, я решил сделать это:

String finalHash = Base64.getUrlEncoder().withoutPadding().encodeToString(hash);
byte[] shorthash = new byte[2];
System.arraycopy(hash.getBytes(), 0, shortHash, 0, 2);
String finalShorthash = Base64.getUrlEncoder().encodeToString(shorthash);

Я не хотел копировать напрямую строку, поскольку я не совсем уверен, что будет двумя байтами в строке.

Затем = ушел для моего хэша, но не для моего короткого замыкания. Я предполагаю, что мне нужно добавить опцию "WithoutPadding" в мой shorthash, но я не понимаю почему, так как это копия моего хэша, который больше не должен иметь padding. Кроме случаев, когда заполнение пропущено только в представлении String, а не в байте за ним?

Может кто-нибудь объяснить это поведение? Это происходит от преобразования между байтом [] и строкой?

1 Ответ

0 голосов
/ 01 сентября 2018

«Почему строка, представляющая мои короткие четыре символа длиной?»

Потому что вы base64 его закодировали. Каждая цифра base64 представляет ровно 6 бит данных. У вас есть 16 бит. 2 цифры недостаточно (всего 12 бит), поэтому вам нужно 3 цифры для представления этих битов. 4-ая цифра - заполнение, потому что base64 обычно нормализуется, чтобы быть кратным 4 цифрам.

...