You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 02:01:33