2015-01-27 6 views
1

Так у меня есть строка с двоичными данными, как это:Преобразование строки в байт-массив без кодирования?

String lob = "ÿØÿà..."; 

Я действительно не имею никакого контроля над этим, так что я должен принять его, как это. Поэтому мне нужно, чтобы преобразовать это как InputStream, не изменяя его, если я просто делаю:

getBytes() 

Он будет использовать кодировку по умолчанию, как я делаю это без кодирования или модификации?

РЕДАКТИРОВАТЬ:

я не могу исправить это из источника. Я действительно знаю, что исходные данные - это изображение, загруженное из HTML GET, но я не знаю, как оно было закодировано во время передачи. Все, что у меня есть сейчас, - очень длинная строка, и мне нужно ее перевести и сохранить в базу данных.

+0

Не могли бы вы просто установить utf-8 и оттуда? – Woot4Moo

+0

@ Woot4Moo: Нет, если OP пытается отменить кодирование, выполненное каким-то более ранним шагом ... –

+0

Проблема в том, что вы уже можете ввернуть; попробуйте и посмотрите, является ли '.indexOf ('\ ufffd')' -1; если это вы _may_ верните его к исходным данным, если нет, SOL! – fge

ответ

11

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

Если вы хотите получить исходные двоичные данные, вам нужно выяснить, какая кодировка была использована для преобразования байтов в строку для начала. Вы можете найти, что ISO-8859-1 будет работать, но вам действительно нужно проверить.

В то же время, вы должны попробовать очень трудно изменить его, чтобы использовать что-то вроде base64. Преобразование произвольных двоичных данных в текст и обратно, как это, является рецептом катастрофы.

+0

Я запустил indexOf ('\ ufffd') в строке, и это не -1, какую кодировку вы бы сказали тогда? И что я должен сделать, чтобы спасти эту ситуацию? – Bill

+0

@Yongke: Это не говорит нам ничего о кодировке - это просто предполагает, что вы теряете информацию, что меня не удивляет. Вы должны действительно решить проблему в ее корне, но мы не знаем достаточно контекста, чтобы сказать больше. –

+0

Что делать, если у вас есть такая строка, которую вы хотите преобразовать в массив байтов [70, 77, 82, 0, 32, 50, 48, 0, 1, 34, 0, -61, -77, 4, 0, 0] – ralphgabb

1

Если это на самом деле является то, что ваша строка содержит двоичные данные, которые были только ошибочно введенные в строку вместо байт-массив, то есть довольно простой способ преобразования:

byte[] target = new byte[lob.length()]; 
for(int i = 0; i < lob.length(); i++) 
    target[i] = (byte)lob.charAt(i); 

Если эти данные как-то текстуально, однако ответ Джона Скита правильный.

(Это, кстати, такой же, как ISO-8859-1 кодирования.)

+0

ИСО-8859-1 превратит символы> 255 в '?' –

+1

@PeterLawrey, правда, это правда, что ISO-8859-1 будет ошибаться, вместо того, чтобы преобразовывать их, но предполагая, что это как описано ОП, что это просто бинарные данные, ошибочно помещенные в строку, в любом случае такого типа не будет, поэтому в помещениях они одинаковы. – Dolda2000

0

Строки использовать UTF-16 кодировку и избежать преобразования вы можете использовать эту кодировку и каждый 16-битный символ является основным отправлено как есть.

Предполагая, что вы находитесь в Little-Endian среде

out.write(lob.getBytes(StandardCharset.UTF_16LE)); 

Все допустимые символы будут посылать без дополнительного кодирования.

Примечание: двоичные данные не должны храниться в строках, если вы действительно не знаете, как это безопасно, поскольку не все 16-битные значения являются допустимыми символами. Лучшим способом хранения двоичных данных является использование байтов.

+0

Как узнать, какая кодировка? Я пробовал indexOf ('\ ufffd'), и он не равен -1, значит ли это, что это UTF8 или UTF16? – Bill

+0

@YongkeBillYu Что вы имеете в виду, о котором вы спрашиваете, «какая кодировка»? –

+0

Строка из файла изображения, поэтому она должна быть преобразована из двоичного файла. Но я не знаю, какая это кодировка. Или я собирался расшифровать его, чтобы получить исходные данные. – Bill

0

Я согласен на 100% с помощью Jon Skeet. Я добавлю, что Java делает неявное преобразование любых данных String в UTF-16, однако это неявное преобразование происходит поверх явного преобразования, которое было сделано тем, кто передает вам эти данные (насколько они это знают или нет), поэтому использование getBytes («UTF-16») автоматически не будет работать, если только они не указывают иное или вы сами это сделали.

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

Смежные вопросы