我有一个数组“结果”,其中包含 0-255 的值。我最初将其声明为 byte[],但是当我必须写入 128 时,result[i] 的值为 -128,并且在输出文件中写入“€”,最终读取为 8364。
正如我所看到的,byte 只接受值 -128 到 127,我应该使用什么数据类型来处理 0-255 之间的值(不浪费内存)?
我是否应该更改内容类型或添加任何字符集 header ?
谢谢
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)
最佳答案
您因混合几个概念而感到困惑。
首先,int 128 与 byte -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。如果您的脚本包含任何大于 255 的 Unicode 字符,此操作将会失败。由于不会出现错误,因此您不应该使用此方法。我只是为了完整性而提及它。
关于java - Java 中写入 ASCII 0-255 的数据类型(ServletOutputStream),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9308455/