ByteBuffer 到 String 和 VIce Versa 不同的结果

Posted

技术标签:

【中文标题】ByteBuffer 到 String 和 VIce Versa 不同的结果【英文标题】:ByteBuffer to String & VIce Versa diferent result 【发布时间】:2020-10-13 09:53:16 【问题描述】:

我创建了两个辅助函数(一个用于 ByteBuffer 到字符串,反之亦然)

public static Charset charset = Charset.forName("UTF-8");
public static String bb_to_str(ByteBuffer buffer, Charset charset)
        System.out.println("Printing start");
        byte[] bytes;
        if(buffer.hasArray()) 
            bytes = buffer.array();
         else 
            bytes = new byte[buffer.remaining()];
            buffer.get(bytes);
        
        return new String(bytes, charset);
    
    
    public static ByteBuffer str_to_bb(String msg, Charset charset)
        return ByteBuffer.wrap(msg.getBytes(charset));
    

我有一个使用 AWS KMS 加密的数据密钥,它提供了我的 ByteBuffer。

// Encrypt the data key using AWS KMS
ByteBuffer plaintext = ByteBuffer.wrap("ankit".getBytes(charset));
EncryptRequest req = new EncryptRequest().withKeyId(keyId);
req.setPlaintext(plaintext);    
ByteBuffer ciphertext = kmsClient.encrypt(req).getCiphertextBlob();

// Convert the byte buffer to String 
String cip = bb_to_str(ciphertext, charset);

现在的问题是这不起作用:

DecryptRequest req1 = new DecryptRequest().withCiphertextBlob(str_to_bb(cip, charset)).withKeyId(keyId);

但这是有效的。

DecryptRequest req1 = new DecryptRequest().withCiphertextBlob(ciphertext).withKeyId(keyId);

我的代码有什么问题?

【问题讨论】:

【参考方案1】:

错误是试图将任意字节数组转换为bb_to_str(ciphertext, charset); 中的字符串。

ciphertext 不以任何合理的方式表示可读字符串,并且绝对不使用您指定的字符集(无论它是哪一个)。

String 用于表示 Unicode 文本。试图用它来表示其他任何东西都会遇到很多问题(主要与编码有关)。

一些编程语言中,字符串类型是二进制字符串(即不严格表示 Unicode 文本),但这些通常是导致大量编码混淆的相同语言。

如果您出于某种原因想将任意byte[] 表示为String,那么您需要选择一些编码来表示它。常见的一种是 Base64 或十六进制字符串。 Base64 更紧凑,十六进制字符串在概念上更简单,但对于相同数量的输入数据会占用更多空间。

【讨论】:

以上是关于ByteBuffer 到 String 和 VIce Versa 不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ByteBuffer 转换为 Integer 和 String?

将 ByteBuffer 的一部分转换回 String

Java ByteBuffer 到字符串

Java:将 String 与 ByteBuffer 相互转换以及相关问题

从 ByteBuffer 读取字符串而不使用双缓冲

将 ByteBuffer 的一部分转换为字符串