首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字节数组从Encoding A转换为Encoding B

将字节数组从Encoding A转换为Encoding B
EN

Stack Overflow用户
提问于 2015-12-22 18:30:06
回答 1查看 19.2K关注 0票数 6

我有一个非常有趣的话题--至少对我来说是这样。例如在UTF-8中给定一个带有字节的新的,我需要一个函数来将这些字节“转换”成UTF-16中的另一个- ByteArrayOutputStream - ByteArrayOutputStream,或者ASCII码,或者你命名它。我天真的方法是使用InputStreamReader并提供所需的编码,但这并不起作用,因为这将读取char[],并且我只能将byte[]写入新的BAOS。

代码语言:javascript
复制
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();
}

现在,这显然不起作用,我正在寻找一种方法来使这种情况成为可能,而不需要从byte[]中构建字符串。

@Edit:因为看起来很难读懂那些显而易见的东西。1) raw:包含从客户端发送给我们的二进制对象字节的ByteArrayOutputStream。这些字节通常以UTF-8格式作为HTTP消息的一部分。2)这里的目标是将这些二进制数据转发到一个不灵活的内部系统--这是一个内部系统--它接受UTF-16格式的这种附件。我不知道为什么连问都不问,它是这么做的。

因此,为了证明我的问题:有没有一种方法可以将字节数组从字符集A转换为字符集B或对您的选择进行编码。再说一次,构建字符串不是我想要的。

谢谢你,并希望这能澄清有问题的部分:)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-22 18:41:41

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

代码语言:javascript
复制
String text = new String(raw.toByteArray(), encoding);
byte[] utf8 = text.getBytes(StandardCharsets.UTF_8);

但是,如果这是不可行的(由于某些未指明的原因...)现在已经差不多了--您只需要在其中添加一个OutputStreamWriter

代码语言:javascript
复制
// 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...但从根本上说,这并不比创建字符串更有效。

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

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34413681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档