智享教程网
白蓝主题五 · 清爽阅读
首页  > 日常经验

byte数组转字符串的几种实用方法

在日常开发中,经常会遇到需要把 byte 数组转换成字符串的场景。比如从网络接口读取数据、处理文件内容,或者解析图片、音频这类二进制资源时,底层传来的往往是一串 byte 数据。这时候想看懂它到底是什么内容,就得转成字符串。

直接使用 new String()

最常见的方式就是用 Java 里的 String 构造函数。只要知道原始数据的编码格式,比如 UTF-8,就可以直接转。

byte[] data = {72, 101, 108, 108, 111}; // 对应 "Hello"
String text = new String(data, "UTF-8");
System.out.println(text); // 输出 Hello

注意这里的编码不能乱写。如果 byte 数据是用 GBK 编码的,却用 UTF-8 去解,结果可能就是乱码。就像拿错钥匙开锁,门打不开还可能拧坏。

指定字符集避免乱码

中文环境下特别容易踩这个坑。比如从一个老系统拿到的 byte 数组是用 GB2312 编码的姓名,代码里默认按 UTF-8 转,张三就变成了“寮犱笁”这种看不懂的东西。

byte[] chineseBytes = {-42, -48, -50, -60}; // "张三" 的 GBK 编码
String name = new String(chineseBytes, "GBK");
System.out.println(name); // 正确输出 张三

处理部分有效数据

有时候 byte 数组里只有前几个字节是有意义的,后面全是 0 或者填充数据。比如某些协议头固定 32 字节,但实际字符串没那么长。这时候可以用子数组截取再转。

byte[] buffer = new byte[32];
// 假设前 5 个字节是有效内容
System.arraycopy("hello".getBytes(), 0, buffer, 0, 5);
String result = new String(buffer, 0, 5, "UTF-8");
System.out.println(result); // 输出 hello

Base64 编码的特殊处理

有些 byte 数组本身不是文本,而是经过 Base64 编码的。比如前端传来一张图片的 base64 字符串,后端接收到的是它的 byte 形式。这时不能直接当文本解码,得先还原。

byte[] base64Bytes = "SGVsbG8=".getBytes();
// 先按 Base64 解码,得到原始字节
byte[] raw = java.util.Base64.getDecoder().decode(base64Bytes);
String msg = new String(raw, "UTF-8"); // 再转字符串
System.out.println(msg); // 输出 Hello

这种情况常见于上传图片、传输加密数据等场景。搞混了解码顺序,就会得到一堆奇怪字符。

调试时的小技巧

如果不确定 byte 数组内容是什么编码,可以先打印每个字节看看规律。负数多的一般是中文编码,正数集中在 0~127 可能是 ASCII。

for (byte b : data) {
    System.out.print(b + " ");
}

也可以试着用不同的编码方式转几次,看哪种能出正常结果。虽然土办法,但在紧急排查时挺管用。