LINUX.ORG.RU

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

 


1

1

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

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

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

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

★★★★★

Последнее исправление: upcFrost (всего исправлений: 2)

Цель - байты должны дойти в строку без изменений с точки зрения hex.

val str = new String(arr, StandardCharserts.US_ASCII)
str.getBytes(StandardCharserts.US_ASCII)
Deleted
()
Ответ на: комментарий от Deleted

str.getBytes(StandardCharserts.US_ASCII)

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

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

но он это никак не увидит

Но ведь

байты должны дойти в строку без изменений с точки зрения hex

Хз как это понимать и зачем это надо.

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

мой блондиночный телепат подсказывает что это то самое что он хочет

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

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

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

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

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

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

Вот ее вроде не пробовал кстати

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

Расскажу когда исправим драйвер

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

можно ж в char сразу по 2 байта запихать, и потом уже в объект. Может сработать

Не может, а так и надо делать если я всё правильно понял.

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

надо смотреть сорцы той поделки - если оно тупо каждый char в два байта переводит - то да, но это маловероятно

Deleted
()
Ответ на: комментарий от utf8nowhere

«Улучшение» из серии «сделаем ещё хуже!».

Почему хуже?

korvin_ ★★★★★
()

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

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

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

я думаю там просто String.format("... %s", new String(bytes)) если честно. завтра гляну

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

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

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

не не, возможно там:

outputStream.write((byte)(str[i]>>>8))
outputStream.write((byte)str[i])

тогда оно клало на все и что не суть в старший байт - все будет на выходе

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

Не, хрен.

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

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

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

Не, хрен.
getBytes()

действительно хрен, только не там где ты подумал, кто кодировку будет указывать?

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

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

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

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

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

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

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

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

если код синхронный то безопаснее править System.getProperty\setProperty до и после вызова

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

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

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

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.