javascript - 使用 contentType 发送的 Java 字节数组:application/octetstream 丢失负字节值
问题描述
我在 java 中有一个整数数组,我将它转换为 ByteArray
public byte[] intArrayToByteArray(int[] arr) {
// create byte buffer
ByteBuffer byteBuf = ByteBuffer.allocate(arr.length*4);
// create a view of the byte buffer as a int buffer
IntBuffer intBuf = byteBuf.asIntBuffer();
intBuf.put(arr);
return byteBuf.array();
}
将这样的数组变成这样[27759020,27682392]
的字节数组:
[1,-89,-111,-84,1,-90,102,88]
这对我来说似乎都很好,问题是当我在多部分表单数据响应中发送数据时(使用 Content-Type: application/octet-stream)。
我正在MultipartEntityBuilder
像这样在我的 servlet 中构建响应
MultipartEntityBuilder mpBuilder = MultipartEntityBuilder.create();
mpBuilder.setBoundary("--boundary");
mpBuilder.addTextBody("meta", json, ContentType.APPLICATION_JSON);
mpBuilder.addBinaryBody("HeightMap", bytes);
HttpEntity multipartData = mpBuilder.build();
try(OutputStream out = response.getOutputStream()) {
multipartData.writeTo(out);
response.setStatus(HttpServletResponse.SC_OK);
} catch(Exception e) {
log.error(" --- Failed writing multipart form data to response. ---");
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
}
我得到一串这样的字符串编码值。
Content-Disposition: form-data; name="HeightMap"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
����fX
在javascript中解码为[1, 65533, 65533, 65533, 1,65533, 102, 88]
用于解码字符串的函数在这里
private static toUint8Array(dataString: string) {
let byteArr = new Uint8Array(dataString.length);
for(let i=0; i < dataString.length; i++) {
let byte = dataString.charCodeAt(i) & 0xFF;
byteArr[i] = byte;
}
return byteArr;
}
(这个函数中的值从 65533 被限制为 253,但最初就是这样.charCodeAt(i)
)
您可以看到 Java 中的每个负字节值都已替换为 UTF-8 '未知字符'值:65533。
是否可以使用另一种类型的字符编码来保留我的字节值?我可以关闭 UTF-8 编码所做的未知值替换吗?
帮助表示赞赏。
解决方案
推荐阅读
- android - 清单合并失败:需要明确指定 android:exported
即使我的 AndroidManifest.xml 文件中没有服务 - reactjs - Redux : 两个非常相似的命令,一个进入 store,另一个不进入
- c# - 在 Unity 中通过按键淡化图像 UI
- wordpress - Wordpress 不返回某些管理页面(如 post.php)的内容
- php - PayU Bolt 表格不接受金额
- javascript - document.cookie 与请求对象中的 cookie 不同吗?
- javascript - 使用 JavaScript 从缓冲区渲染画布图像
- java - 带有反应式 mongodb 的 Spring Boot webflux。java.lang.NoSuchMethodException:com.acme.dao.model.Transit。
() - javascript - 如何预填充反应formik表单
- javascript - 如何让 jquery 忽略选择菜单中的选项