2012-01-16 60 views
0

在我的代碼中(在doGet方法中的HttpServlet),我需要寫一個字節,可以取任何值,從0到255, .js文件。我在調試器中檢查了結果[1]的值爲0.但是,在外部文件中它被寫爲空格,當我嘗試讀取它時,其字節值爲「32」。我只有字節0這個問題,其餘的這是完美的。有任何想法嗎?Byte「0」用Java的OutputStream.write()函數寫成字節「32」

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中等價的是什麼?

謝謝

+2

你爲什麼要設置內容類型'圖像/的JavaScript文件gif'? – 2012-01-16 08:51:01

+0

因爲這個JS文件可以包含非文本字符(如這個字節0),並且如果我使用內容類型「text/javascript」會是一個問題,對不對?謝謝 – Arturo 2012-01-16 11:02:20

+1

javascript是文本。我沒有意識到任何瀏覽器會使包含二進制字符的JavaScript變得有意義。 – 2012-01-16 11:04:23

回答

1

讀取二進制數據已經在Stackoverflow回答:How do I read binary data to a byte array in Javascript?

內容類型更好的是application/octet-stream,沒有內容處置標題。

+0

感謝您的幫助。我無法刪除內容處置標題,因爲我確實需要將這些數據顯示爲附件。然後我用讀二進制函數嘗試了「application/octet-stream」,並且它仍然讀取一個「32」(空格),我在其中看到OutputStream.write函數有一個「0」。我相信這是一個寫作問題,而不是閱讀。也許我應該以某種方式指定輸出文件的字符集? – Arturo 2012-01-16 23:37:47

+0

我編輯了我最初的問題,用Javascript修復了這個問題。但我不知道該怎麼做Java。 – Arturo 2012-01-17 00:19:39

+0

然後加密函數必須是錯誤的,或者是原始參數。 – 2012-01-17 02:10:28

1

32是空格的ASCII值。這就是爲什麼你變得空白爲32.

+0

謝謝。但爲什麼ASCII 0寫成空格? – Arturo 2012-01-16 11:01:08

+0

ASCII 0是NULL(請檢查http://www.asciitable.com) – Apurv 2012-01-16 11:02:28

+0

@ user411103必須有一個替代方案,你在做什麼。爲什麼要在文本文件中包含二進制數據?\ – Apurv 2012-01-16 11:15:53

0
+0

有趣的是,如果我將這段代碼部署到Google App Engine,它就可以工作。但它不在我的測試服務器(Eclipse)中。也許是一個charset? – Arturo 2012-01-18 08:17:19

+0

您是說您的原始代碼在Google App Engine中工作? – Apurv 2012-01-18 08:53:07

+0

這正是我所說的。並使用JS文件。也許GAE默認在HttpServlet中應用不同的字符集doGet/doPost? – Arturo 2012-01-18 15:06:27

相關問題