2012-02-16 103 views
0

我有一个数组“结果”,其中包含0-255的值。我最初将它声明为byte [],但是当我必须写128时,结果[i]得到值-128,并且在输出文件中将其写为“€”,最终读为8364。在Java(ServletOutputStream)中写入ASCII 0-255的数据类型

因为我可以看到该字节只接受值-128到127,我应该使用什么数据类型来从0-255的值(不浪费内存)?

我是否应该更改内容类型或添加任何字符集标题?

感谢

res.setContentType("application/octet-stream"); 
res.setHeader("Content-Disposition","attachment;filename=output.js"); 
ServletOutputStream os = res.getOutputStream(); 
byte[] result=encode(req.getParameter("originalScript")); // Result[i]=-128 (should be 128) 
os.write(result,0,result.length); // result[i] on output.js is written as "€" (8364) 

回答

2

你通过混合几个概念混淆。

首先,int 128与字节-128(int 255 == byte -1,254 == -2,... 128 = -128)相同。字节为,签名为,符号信息位于最高位。这里你的错误是你没有使用正确的方法将字节值转换回int。为了解决这个问题,使用此代码:

b = (byte) 128; 
int i = b & 0xff; 
System.out.println(b); 
System.out.println(i); 

-128128

下一页:ASCII仅定义为0到127之间的值。这意味着任何> 127的内容都是垃圾,除非您认真对待它。

问题是当你的你的代码的输出。由于ASCII不能包含大于127的值,读代码应该做什么?

“output.js”听起来像您正在使用Web浏览器将此数据作为JavaScript文件读取。网络浏览器将尝试使用“编码”将字节流转换为文本。你没有指定一个,浏览器必须猜测并且弄错了(并且application/octet-stream看起来也是错的,不应该是text/javascript?)。

你有两个选择:

  1. 变化encode()返回正确UTF-8编码字符串(UTF-8发送Unicode以字节为单位的方式)和字符集设置为UTF-8(通常是默认值,但更好的安全比遗憾):

    response.setHeader("Content-Type", "text/javascript; charset=UTF-8"); 
    
  2. 将charset到ISO-8859-1,将保留字节1:1。如果您的脚本包含任何Unicode字符> 255,则这将失败。由于不会出现错误,因此您应该使用此方法而不是。我只是提到它的完整性。

1

这是很难相信,您的应用程序的内存需求是在这个时代那么严格。

没有任何进一步的质疑你的动机,这里是你可以做什么:

byte[] result=encode(req.getParameter("originalScript")); 
char[] tmp = new char[result.length]; 
for (int i = 0 ; i != result.length ; i++) { 
    tmp[i] = (char)(result[i] & 0xFF); 
} 
os.print(new String(tmp));