首页 > 解决方案 > 使用 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 编码所做的未知值替换吗?

帮助表示赞赏。

标签: javascriptjavaarraysutf-8binary

解决方案


推荐阅读