当前位置:  开发笔记 > 编程语言 > 正文

将字节数组从编码A转换为编码B.

如何解决《将字节数组从编码A转换为编码B.》经验,为你挑选了1个好方法。

我有一个非常有趣的话题 - 至少对我而言.给定一个带有字节的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或编码你的选择.再次建立一个字符串不是我想要的.

谢谢你,并希望清除可疑的部分:).



1> Jon Skeet..:

正如评论中提到的,我只是转换为字符串:

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 ......但从根本上说,这几乎不比创建字符串更有效.

如果内存效率是一个特别关注的问题,您可以执行多次传递以计算出需要多少字节,创建写长度的字节数组,然后调整代码以直接写入该字节数组.

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有