使用contentType发送的Java字节数组:应用程序/八位字节流丢失负字节值

时间:2018-10-11 13:55:38

标签: javascript java arrays utf-8 binary

我在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编码所做的未知值替换吗?

感谢您的帮助。

0 个答案:

没有答案