2012-01-16 57 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

相关问题