JSP (Java): кодирование байтового массива и использование в JavaScript аналогично C#

Я использую этот код в C# .net для отправки запроса на веб-страницу.

        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
        Byte[] rnd = new Byte[64];
        rng.GetBytes(rnd);
        hidChallenge.Value = Encoding.Unicode.GetString(rnd);

И я его в java скрипте использую.

var base64str = document.getElementById("<%=hidChallenge.ClientID %>");

При запуске и отладке:

base64str =  感≗좦短䗅燛梻脕冔춇噙풣訋詇蹘᧩쾏휇᯸늸䫐顨◣希ࠟ䠎ᐷ

Но в java (JSP)

Я использую этот код:

Random r = new Random();
byte[] rndbyte = new byte[64];
r.nextBytes(rndbyte);
String challenge = new String(rndbyte,StandardCharsets.UTF_16LE);                    
session.setAttribute("challenge", challenge);

И в javascript:

var base64str = 퓻 �ꦖ 쁳 春 꼪 ꝝ 䣇 ͋ꟼ 䆺 㺪 ᠁ 郷 ̣ 攺 줶 歮 ㏹ 㬎 ꢔ 崬 魔 弝 翊 

Я также стараюсь следовать кодировке:

US_ASCII

UTF_8

UTF_16

Итак, я получаю ошибку строки base 64.

Какого черта? Это не base64. Это ... Хорошо, я это видел. Прервется, если два байта находятся внутри суррогатного диапазона.

Johannes Kuhn 29.04.2018 13:43

Честно говоря, просто используйте base64.

Johannes Kuhn 29.04.2018 13:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

похоже, что существует путаница между тем, для чего предназначены UTF-8/16 или Ascii, и Base64.

UTF-8 предназначен для кодирования строки в байтовую последовательность. И Base64 предназначен для кодирования последовательности байтов в строку.

Если вы хотите сгенерировать base64 на Java, вот как это должно выглядеть:

Random r = new Random();
byte[] rndbyte = new byte[64];
r.nextBytes(rndbyte);
String challenge = Base64.encodeBase64String(rndbyte);                    
session.setAttribute("challenge", challenge);

Вот еще один пост, который довольно хорошо объясняет разницу, если вы хотите узнать об этом больше: В чем разница между UTF8 / UTF16 и Base64 с точки зрения кодировки

Другие вопросы по теме