PowerShell与Java中UTF-8字符串转字节数组输出结果不一致问题
输出不一致的根本原因
两边输出结果不同和UTF-8字符串转字节数组的逻辑本身无关,是两边打印字节数组时的默认行为完全不同,且代码本身存在笔误导致结果异常:
- PowerShell侧代码存在语法笔误:你写的代码开头缺少左方括号,正确代码应为
你拿到的返回结果[System.BitConverter]::ToString([System.Text.Encoding]::UTF8.GetBytes("1234AbCd"))31-32-33-34-41-62-43-64c末尾多出来的c就是语法解析错误导致的异常输出。执行修正后的代码,会返回用连字符分隔的字节十六进制值31-32-33-34-41-62-43-64,这才是字符串"1234AbCd"对应的UTF-8字节的正确可读形式。 - Java侧的打印逻辑用错了:直接把字节数组对象传给
System.out.println()时,不会自动输出数组里存储的字节内容,会默认调用数组对象的toString()方法。Java中数组的默认toString()实现不会遍历数组元素,返回的固定格式为[类型标识@对象哈希码十六进制值,你看到的[B@2401f4c3里,[B表示当前对象是byte类型数组,@后面的字符串是该数组对象在JVM中的内存哈希值,和数组实际存储的内容没有任何关联。
如果要在Java侧拿到和PowerShell一致的可读字节输出,需要主动格式化字节数组内容,比如用JDK内置工具类实现:
import java.nio.charset.StandardCharsets; import java.util.Arrays; public class Test { public static void main(String[] args) { String message = "1234AbCd"; byte[] bytes = message.getBytes(StandardCharsets.UTF_8); // 打印十进制字节值 System.out.println(Arrays.toString(bytes)); // JDK17+可转成和PowerShell格式一致的连字符分隔十六进制输出 System.out.println(java.util.HexFormat.of().withDelimiter("-").formatHex(bytes)); } }
执行上述代码后输出的结果和PowerShell修正代码后的返回值完全一致,说明两边UTF-8转字节数组的底层逻辑没有差异。
内容的提问来源于stack exchange,提问作者machobymb
相关产品推荐
相关产品推荐

