簡體   English   中英

將字節數組從編碼A轉換為編碼B.

[英]Convert a byte array from Encoding A to Encoding B

我有一個非常有趣的話題 - 至少對我而言。 給定一個帶有字節的ByteArrayOutputStream,例如UTF-8,我需要一個能夠將這些字節“轉換”成另一個字節的函數 - 新的 - ByteArrayOutputStream,例如UTF-16,或ASCII或你命名它。 我天真的方法是使用一個InputStreamReader並提供所需的編碼,但這不起作用因為它將讀入char []而我只能將byte []寫入新的BAOS。

public byte[] convertStream(Charset encoding) {
    ByteArrayInputStream original = new ByteArrayInputStream(raw.toByteArray());
    InputStreamReader contentReader = new InputStreamReader(original, encoding);
    ByteArrayOutputStream converted = new ByteArrayOutputStream();

    int readCount;
    char[] buffer = new char[4096];
    while ((readCount = contentReader.read(buffer, 0, buffer.length)) != -1)
        converted.write(buffer, 0, readCount);

    return converted.toByteArray();
}

現在,這顯然不起作用,我正在尋找一種方法來使這種情況成為可能,而不是從字節[]中構建一個字符串。

@Edit:因為看起來很難讀出明顯的東西。 1)raw:ByteArrayOutputStream,包含從客戶端發送給我們的BINARY對象的字節。 字節通常以UTF-8作為HTTP消息的一部分。 2)這里的目標是將此BINARY數據發送到一個不靈活的內部系統 - 這是一個內部系統 - 它接受UTF-16中的這些附件。 我不知道為什么不問,它是這樣的。

因此,為了證明我的問題:有沒有辦法將字節數組從Charset A轉換為Charset B或編碼你的選擇。 再次建立一個字符串不是我想要的。

謝謝你,並希望清除可疑的部分:)。

正如評論中提到的,我只是轉換為字符串:

String text = new String(raw.toByteArray(), encoding);
byte[] utf8 = text.getBytes(StandardCharsets.UTF_8);

但是,如果這不可行(出於某些未指明的原因......)你現在所擁有的幾乎就是 - 你只需要在混合中添加一個OutputStreamWriter

// Nothing here should throw IOException in reality - work out what you want to do.
public byte[] convertStream(Charset encoding) throws IOException {       
    ByteArrayInputStream original = new ByteArrayInputStream(raw.toByteArray());
    InputStreamReader contentReader = new InputStreamReader(original, encoding);

    int readCount;
    char[] buffer = new char[4096];
    try (ByteArrayOutputStream converted = new ByteArrayOutputStream()) {
        try (Writer writer = new OutputStreamWriter(converted, StandardCharsets.UTF_8)) {
            while ((readCount = contentReader.read(buffer, 0, buffer.length)) != -1) {
                writer.write(buffer, 0, readCount);
            }
        }
        return converted.toByteArray();
    }
}

請注意,您仍然在內存中創建額外的臨時數據副本,無論是UTF-8而不是UTF-16 ......但從根本上說,這幾乎不比創建字符串更有效。

如果內存效率是一個特別關注的問題,您可以執行多次傳遞以計算出需要多少字節,創建寫長度的字節數組,然后調整代碼以直接寫入該字節數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM