Я хотел конвертировать любую длину строки в фиксированные 32 байта - PullRequest
0 голосов
/ 05 июня 2018

Я хочу преобразовать любую длину строки в byte32 в Java.

Код

String s="9c46267273a4999031c1d0f7e40b2a59233ce59427c4b9678d6c3a4de49b6052e71f6325296c4bddf71ea9e00da4e88c4d4fcbf241859d6aeb41e1714a0e";

//Convert into byte32

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Из комментариев стало ясно, что вы хотите уменьшить объем памяти этой строки до 32 байт.

Данная строка может быть легко сжата со 124 байтов до 62 байтов, выполнив шестнадцатеричное преобразование.

Однако алгоритма не существует, и не будет алгоритма, который может сжимать любые данные до 32 байтов.Представьте, что это было бы возможно: это было бы реализовано, и вы могли бы получить ZIP-файлы размером всего 32 байта для любого сжатого файла.

Поэтому, к сожалению, ответ таков: это невозможно.

0 голосов
/ 05 июня 2018

Вы не можете преобразовать любую строку длины в байтовый массив длиной 32.

Java использует UTF-16 в качестве строкового кодирования, поэтому для хранения 100% строки, 1: 1 как байтовый массив фиксированной длины, вы бы на первый взгляд были ограничены 16 символами.

Если вы готовы жить с ограничением в 16 символов, byte [] bytes = s.GetBytes ();должен дать вам байтовый массив variable length, но лучше указать явную кодировку.например, byte [] array2 = str.getBytes("UTF-16");

Это не полностью решит вашу проблему.Теперь вам, вероятно, придется проверить, что байтовый массив не превышает 32 байта, и придумать стратегии для заполнения, возможного нулевого завершения (которое потенциально может съесть ваш бюджет персонажа)

Теперь, если вы неВам не нужно все строковое пространство UTF-16, которое Java по умолчанию использует для строк, вы можете избежать использования более длинных строк, используя другие кодировки.

ЕСЛИ это будет использоваться для любого другого стандарта иличто-то (я вижу ссылки на etherium), тогда вам нужно будет следовать их стандартам.

Если вы не пишете свою собственную библиотеку для непосредственного обращения с ней, я настоятельно рекомендую использоватьбиблиотека, которая уже существует, и, кажется, хорошо протестирована и используется.

0 голосов
/ 05 июня 2018

Вы можете достичь с помощью следующей функции

byte[] bytes = s.getBytes();
...