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
相关产品推荐
相关产品推荐

