在Java中写入ASCII 0-255的数据类型(ServletOutputStream)

时间:2012-02-16 09:18:52

标签: java servlets character-encoding bytearray outputstream

我有一个数组“result”,其中包含0-255之间的值。我最初将它声明为byte [],但是当我必须写入128时,result [i]得到值-128并且在输出文件中它被写为“€”,最终被读作8364。

我可以看到该字节只接受-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 个答案:

答案 0 :(得分: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”听起来像是在使用网络浏览器将此数据作为JavaScript文件读取。 Web浏览器将尝试使用“编码”将字节流转换为文本。你没有指定一个,浏览器必须做出猜测并弄错(并且application/octet-stream似乎也是错误的。那不应该是text/javascript吗?)。

您有两种选择:

  1. 更改encode()以返回正确编码的UTF-8字符串(UTF-8是一种将unicode作为字节发送的方法)并将字符集设置为UTF-8(这通常是默认值但最好是安全而不是抱歉):

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

答案 1 :(得分: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));