LINUX.ORG.RU

byte[] в String без изменений

 


1

1

Мучаюсь с конвертацией байт-массива в строку. Никакой кодировки там нет, суть - обойти косяк следующей по вызову либы. Цель - байты должны дойти в строку без изменений с точки зрения hex.

Проблем две. Первая - byte в даже signed, а стока состоит из unsigned char. Пока додумался до цикла с byte & 0xff, но думаю где-то есть либа для этого

Вторая проблема что жаба видя странный символ думает что я упорот и фиксит его на хрен знает что либо падает в exception. Вот как это обойти пока хз, чую через charset.

Подскажите плз как это сделать без 100500 циклов и боли

★★★★★

Ответ на: комментарий от no-such-file

Затем что оно потом идет в http-post со строкой внутри, по независящим от меня причинам. И когда оно конвертит байты с строку оно берет двухбайтный char, считает что скажем байт 0xff отрицательный и кодирует его в 65535.

upcFrost ★★★★★ ()
Ответ на: комментарий от upcFrost

ну если оно '\0' тоже будет кодировать - то тебе ничего не поможет, ну максимум похачить этот чудо код с которым ты работаешь

кстати что это за поделка такая?

subwoofer ★★★★★ ()
Последнее исправление: subwoofer (всего исправлений: 1)

1) если тебе нужен аналог reinterpret_cast, то ручками со сдвигами и битовыми масками играйся по перегонке byte[] -> char[] -> String(char[]).

2) если тебе нужно непойми что, то уточняй задачу, пока сам не поймёшь что хочешь.

dzidzitop ★★ ()
Ответ на: комментарий от subwoofer

Почему ничего не поможет. Кодировка это тупо пара кодер/декодер. Я писал свою кодировку — там делов на полчаса. Не припомню, чтобы в JDK где-то была проверка на \0, нет такого скорее всего. Так что без проблем можно засунуть в String нулевые байты. Если этому драйверу можно подсунуть свою кодировку для обратного преобразования в байты (скорее всего можно), то всё будет работать, хоть и через ректу.

Legioner ★★★★★ ()
Ответ на: комментарий от subwoofer

Не, хрен.

Hex.encodeHexString(byteArray) = 4682ed57b14...
Hex.encodeHexString(new String(byteArray,StandardCharsets.ISO_8859_1).getBytes()) = 46c282c3ad57...

c ASCII аналогично. чую правда по два байта в символ в цикле пихать

upcFrost ★★★★★ ()
Ответ на: комментарий от subwoofer

автор драйвера :( сейчас зарылся в драйвер, пытаюсь понять в каком месте он перекодирует байт-массив. но судя по всему там кодировка не указывается, так что getBytes() без кодировки как раз корректная проверка

нашел, там просто аргумент засовывается в stringbuilder, который автоматом кастует byte[] в char[], что и плодит ошибку

upcFrost ★★★★★ ()
Последнее исправление: upcFrost (всего исправлений: 1)
Ответ на: комментарий от upcFrost

не, это полный залет, увы. при попытке передать строку драйвер присобачивает кавычки и все портит. при попытке передать байт-массив - коряво кодирует его. если передавать объект - получаю вообще Arrays.toString(). печаль.

upcFrost ★★★★★ ()
Ответ на: комментарий от upcFrost

getBytes кодирует стандартной кодировкой, которую можно указать через -Dfile.encoding виртуальной машине. Попробуй написать свою кодировку, которая будет тупо байт в char кастовать и обратно, может и получится. С UTF-8 оно правда будет не очень совместимо, так что может поломать программу в других местах, если кроме латинницы что-то используется.

Legioner ★★★★★ ()
Ответ на: комментарий от upcFrost

Дык, а если ему String через setObject передать?

зы. а вообще нахрен, ты как красная девица шифруешься что у тебя там за говнокод, разбирайся сам

subwoofer ★★★★★ ()
Последнее исправление: subwoofer (всего исправлений: 1)