Байтовый массив Java, отправленный с contentType: application / octetstream, теряющий отрицательные байтовые значения - PullRequest
0 голосов
/ 11 октября 2018

У меня есть массив целых чисел в 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).

I 'используя MultipartEntityBuilder, чтобы построить ответ в моем сервлете, как это

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;
}

(значение в этой функции ограничено 253 из 65533, но изначально это то, что .charCodeAt(i) дает)

Вы можете видеть, что каждое из отрицательных байтовых значений из Java было заменено значением «неизвестного символа» UTF-8: 65533.

Возможно ли использовать другой тип кодировки символов, который сохранитзначения моих байтов?Можно ли отключить замену неизвестного значения, которую выполняет кодировка UTF-8?

Помощь приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...