Байт 0 записан как байт 32 с помощью функции Java OutputStream.write()

В моем коде (HttpServlet в методе doGet) мне нужно записать байты, которые могут принимать любое значение от 0 до 255, в файл .js. Я проверил в отладчике, что результат [1] имеет значение 0. Однако во внешнем файле он записывается как пробел, и когда я пытаюсь прочитать, он имеет значение байта «32». У меня такая проблема только с байтом 0, в остальном все работает отлично. Есть идеи?

res.setContentType("image/gif");
res.setHeader("Content-Disposition","attachment;filename=myFile.js");
OutputStream os = res.getOutputStream();
byte[] result=encrypt(req.getParameter("original")); // Here result has values [64,0,81,80]
os.write(result,0,result.length);

Я получаю значения из внешнего JavaScript:

var whatever = data[1].charCodeAt(0); // whatever has value 32

Я видел аналогичную проблему в программе Javascript, и они исправили эту проблему, включив этот цикл прямо перед записью в файл:

for (var i=0; i<result.length; i++) {
    result[i] = String.fromCharCode(result[i]); }

Я сделал несколько тестов и работает для Javascript. Что было бы эквивалентно в Java?

Спасибо


person Community    schedule 16.01.2012    source источник
comment
Почему вы устанавливаете тип контента image/gif для файла javascript?   -  person Darin Dimitrov    schedule 16.01.2012
comment
Потому что этот JS-файл может включать нетекстовые символы (как этот байт 0), и если я использую тип контента text/javascript, это будет проблемой, верно? Спасибо   -  person    schedule 16.01.2012
comment
javascript - это текст. Я не знаю ни одного браузера, который бы понимал javascript, содержащий двоичные символы.   -  person Darin Dimitrov    schedule 16.01.2012
comment
Спасибо Дарин. Пожалуйста, смотрите мой ответ на комментарий Апурва ниже (Давайте продолжим...).   -  person    schedule 16.01.2012


Ответы (3)


На чтение двоичных данных уже ответили в Stackoverflow: Как прочитать двоичные данные в массив байтов в Javascript?.

Тип контента лучше application/octet-stream, без заголовка размещения контента.

person Joop Eggen    schedule 16.01.2012
comment
Спасибо за вашу помощь. Я не могу удалить заголовок content-disposition, потому что мне очень нужно, чтобы эти данные отображались в виде вложения. Затем я попробовал application/octet-stream с двоичной функцией чтения, и это все еще чтение 32 (пробел), где я вижу, что функция OutputStream.write имеет 0. Я считаю, что это проблема записи, а не чтения. Возможно, мне следует как-то указать кодировку для выходного файла? - person ; 17.01.2012
comment
Я отредактировал свой первоначальный вопрос чем-то, что решает эту проблему в Javascript. Но я не уверен, что делать для Java. - person ; 17.01.2012
comment
Тогда функция шифрования должна быть ошибочной или исходным параметром. - person Joop Eggen; 17.01.2012
comment
Joop, я только что попробовал очень простой пример: byte[] result=new byte[3];result[0]=65;result[1]=0;result[2]=66;os.write(result,0, результат.длина);os.flush();os.close(); И я получаю [65,32,66], так что это не функция или параметр шифрования. Возможно, функция setCharacterEncoding()? Спасибо - person ; 17.01.2012
comment
Вы пытались сохранить его как файл в браузере, т.е. чтение? os.write должен быть в порядке. Может быть, изменить имя вложения на что-то двоичное. Кстати, когда все работает, можно добавить setContentLength. - person Joop Eggen; 17.01.2012
comment
Спасибо. Что-то интересное, что заставляет меня думать, что это проблема с кодировкой. Тот же код работает, когда я развернул его в Google App Engine. Еще одно отличие моего тестового сервера (Eclipse) от GAE: просто чтение текста из внешнего файла, в моем тестовом сервере это включает 13 байт в конце буфера чтения, а в GAE нет. Есть идеи? - person ; 18.01.2012
comment
Да, двоичные данные, похоже, обрабатываются как текст; поэтому .js вызывает подозрения, так как указывает на текст. - person Joop Eggen; 18.01.2012
comment
В GAE я также использую .JS и работаю. Возможно, в этой среде по умолчанию применяется другая кодировка для HttpServlet.doPost()? - person ; 18.01.2012

32 — это значение ASCII для пробела. Вот почему вы становитесь пустым для 32.

person Apurv    schedule 16.01.2012
comment
Спасибо. Но почему ASCII 0 записывается как пробел? - person ; 16.01.2012
comment
@user411103 user411103 должна быть альтернатива тому, что вы делаете. Почему вы хотите включить двоичные данные в текстовый файл?\ - person Apurv; 16.01.2012
comment
Давайте не будем усложнять. Забудьте, что это файл .js. Я просто хочу написать в двоичном файле ASCII 0 (что равно NULL, но не BLANK SPACE) и прочитать его как 0, но не 32. Что было бы не так в приведенном выше коде? Спасибо - person ; 16.01.2012
comment
Проблема начинается при попытке прочитать его с помощью 'charCodeAt'. Если вы пишете что-то в виде двоичных данных, читайте это как двоичные данные, а не как текст. - person Apurv; 16.01.2012
comment
@ user411103 Можете ли вы попробовать это codeproject.com/KB/scripting/Exsead7.aspx для чтения бинарных данных из JS? - person Apurv; 16.01.2012
comment
Спасибо, Apurv, я попробую этот код. Я согласен с тем, что мне не следует использовать charCodeAt для чтения двоичных данных, но я считаю, что проблема во время записи, поскольку я сравниваю выходной файл с тем, который я подтверждаю правильно, и 0 вместо того, чтобы быть записанным (пробел) (ноль), то есть правильно. Итак, почему в моем коде 0 записывается как пробел с использованием OutputStream.write()? - person ; 16.01.2012

Вы можете проверить эти

Есть ли способ отправить двоичные данные с помощью XMLHttpRequest объект?

Отправлять и получать двоичные данные через веб-сокеты в Javascript?< /а>

http://www.codeproject.com/KB/scripting/Javascript_binaryenc.aspx

http://support.microsoft.com/kb/296772

person Apurv    schedule 17.01.2012
comment
Забавная история в том, что если я разверну этот код в Google App Engine, он заработает. Но его нет на моем тестовом сервере (Eclipse). Возможно кодировка? - person ; 18.01.2012
comment
Вы говорите, что ваш исходный код работает в Google App Engine? - person Apurv; 18.01.2012
comment
Это именно то, что я говорю. А также работа с файлом JS. Возможно, GAE по умолчанию применяет другую кодировку в HttpServlet doGet/doPost?? - person ; 18.01.2012