我有一个数组“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)
答案 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);
提供-128
和128
。
下一步:ASCII仅定义0到127之间的值。这意味着任何>除非你仔细对待,否则127是垃圾。
问题是当您读取代码的输出时。由于ASCII不能包含值> 127,阅读代码应该做什么?
“output.js”听起来像是在使用网络浏览器将此数据作为JavaScript文件读取。 Web浏览器将尝试使用“编码”将字节流转换为文本。你没有指定一个,浏览器必须做出猜测并弄错(并且application/octet-stream
似乎也是错误的。那不应该是text/javascript
吗?)。
您有两种选择:
更改encode()
以返回正确编码的UTF-8字符串(UTF-8是一种将unicode作为字节发送的方法)并将字符集设置为UTF-8
(这通常是默认值但最好是安全而不是抱歉):
response.setHeader("Content-Type", "text/javascript; charset=UTF-8");
将字符集设置为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));