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

标签 java servlets character-encoding arrays outputstream

我有一个数组“结果”,其中包含 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);

给出-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。如果您的脚本包含任何大于 255 的 Unicode 字符,此操作将会失败。由于不会出现错误,因此您不应该使用此方法。我只是为了完整性而提及它。

关于java - Java 中写入 ASCII 0-255 的数据类型(ServletOutputStream),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9308455/

相关文章:

java - 什么是比较 StringBuilder 对象的有效方法

java - 使用java创建多条目zip文件时出现问题

java - 如何使用 Struts 2 在 Apache Tomcat 应用程序中建立数据库连接

来自API的奇怪字符串的java char编码

java - Dagger 2 不生成组件

java - 链接数组 Java - 显示 int 和 String?

tomcat - javax.命名.NamingException : Cannot create resource instance

java - 使用init读取WEB-INF文件夹java中的属性文件

ios - 将 uint8_t 转换为 NSString

c# - 获取写入文件时字符串占用的大小(以字节为单位)?