0

我目前将字符串存储为字节数组。但是,当我尝试使用以下代码使用 Charset 将字节转换回字符串时,最后会出现菱形:

byte[] testbytes = "abc123".getBytes(); // tried getBytes("UTF-8"/StandardCharsets.UTF_8) too

Charset charset = Charset.forName("UTF-8"); // ISO-8859-1 has no diamonds
CharBuffer charBuffer = charset.decode( ByteBuffer.wrap( Arrays.copyOfRange(testbytes,0,testbytes.length) ) );

System.out.println("converted = " + String.valueOf(charBuffer.array()) );
// returns this - abc123����������

如果我将编码设置为 ISO-8859-1,它转换得很好。我认为这可能是源代码文件的编码,但在 Notepad++ 中打开它表明它也是 UTF-8。

我是否遗漏了什么,或者这只是 Android Studio 的 Logcat 窗口的问题?

- 编辑 1 -

进一步测试表明,3个字符的字符串结尾没有这个填充问题。如果您使用更长的字符串, Charset.decode 似乎会根据断点用 \u0000 值填充 char 数组。

String.valueOf 最终会将填充字符打印为菱形,同时创建一个新的 String 对象会删除填充,但是,由于敏感值,我根本不想使用 String 将字节数组转换为 char 数组。

- 编辑 2 -

如果您再次调用 charset.decode() 似乎会发生上述情况,所以我猜有一个缓冲区正在附加但不确定在什么时候。尝试使用 charBuffer.clear() 清除,但第二个代码块的输出似乎相同,即 3 个字符 + 2 个空格 + 6 个新字符。

        String test1 = "123";
        byte[] test1b = test1.getBytes();
        char[] expected1 = test1.toCharArray();
        CharBuffer charBuffer = charset.decode( ByteBuffer.wrap( test1b ) );
        char[] actual1 = charBuffer.array(); // size 3, correct

        String test2 = "123456";
        byte[] test2b = test2.getBytes();
        char[] expected2 = test2.toCharArray();
        CharBuffer charBuffer2 = charset.decode( ByteBuffer.wrap( test2b ) );
        char[] actual2 = charBuffer2.array(); // size 11, padded with '\u0000' 0
4

1 回答 1

0

您是否尝试使用String接收字节数组的构造函数?喜欢:

byte[] testbytes = "abc123".getBytes(StandardCharsets.UTF_8);
String stringDecoded = new String(testbytes, StandardCharsets.UTF_8);

也许它可以解决你的问题。

于 2021-05-11T00:43:04.657 回答