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

32字节数组转32位字符串时长度异常的问题咨询

问题分析与解决方案

嘿,我一眼就看出问题所在啦!你现在得到64位字符串的原因是,你并没有把byte数组转回原字符串,而是把每个byte值转换成了两位十进制数字的字符串——比如原字符串里的'1'对应的ASCII值是49,会被格式化为"49",32个这样的byte每个都变成两位字符,最终长度自然是32×2=64了。

正确的转换方式

如果你的目标是把byte数组还原成最初的32位字符串,直接使用String类的构造方法即可,它是String.getBytes()的逆操作:

import java.nio.charset.StandardCharsets;

class Go {
    public void run() {
        String testString = "12345678901234567890123456789012";
        // 建议指定编码,避免不同环境下的字符编码差异
        byte[] bytesData = testString.getBytes(StandardCharsets.UTF_8);
        // 直接用byte数组构造出原字符串
        String restoredString = new String(bytesData, StandardCharsets.UTF_8);
        System.out.println(restoredString);
        System.out.println("恢复后的字符串长度:" + restoredString.length()); // 输出32
    }

    public static void main(String[] v2) {
        Go v = new Go();
        v.run();
    }
}

为什么原代码会出问题?

原代码里的String.format("%2d", b)是把每个byte的数值转换成十进制字符串,比如:

  • 字符'0'的byte值是48 → 转成"48"
  • 字符'9'的byte值是57 → 转成"57"

这相当于把每个字符的ASCII码值以两位数字的形式拼接,完全不是“还原原字符串”的逻辑,所以长度直接翻倍了。

额外提示

如果你的真实需求是把byte数组转换成十六进制字符串(比如常见的哈希值存储场景),那才需要逐个byte转成两位十六进制字符——如果这是你的目标,可以告诉我,我再给你对应的实现~

内容的提问来源于stack exchange,提问作者KingFish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:19:11