Как представить литералы uint8 в Java - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь повторно реализовать некоторый код, который использует libsodium в Java. Исходный код объявляет массив типа uint8:

#define SECRET ((uint8_t[]){ 0xAA, 0xBB, 0xCC ... }) // not the real secret!

и кормит это либодиуму crypto_hash_sha256_update

Моя задача при реализации этого в Java состоит в том, что в Java нет беззнаковых байтов, поэтому я не могу набрать 0xAA как байт.

Вещи, которые я пробовал:

  • Объявление моего массива как short / int: я думаю, что это ломается из-за заполнения 0
  • Объявление литералов в формате 0b11110000..., это не дает правильных ответов (у меня есть некоторые тестовые данные из оригинальной реализации)
  • Объявление массива char [] и конкатенация литералов: final char [] salt = {0xAABB, 0xCCDD, ...} `, также не дает правильных ответов

EDIT это моя короткая попытка

    final short[] salt = { 0xAA, 0xBB, ...};


    final Hasher hasher = Hashing.sha256().newHasher();
    hasher.putLong(input);
    for (int i=0; i < salt.length; i++) {
        hasher.putShort(salt[i]);
    }
    return hasher.hash().asBytes();

1 Ответ

0 голосов
/ 11 мая 2018

Похоже, мой исходный код сработал

final short[] salt = { 0xAA, 0xBB, ...};


final Hasher hasher = Hashing.sha256().newHasher();
hasher.putLong(input);
for (int i=0; i < salt.length; i++) {
    hasher.putShort(salt[i]);
}
return hasher.hash().asBytes();

Проблема была в том, что я забыл оставить результаты в левой части перед сравнением

...