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

Java 7下如何打印可处理非可打印值的字节数组

解决Java 7字节数组的两种打印需求:十六进制字符串与可打印文本

嘿,我完全懂你的需求——在Java 7环境下处理任意字节数组,输出清晰的十六进制字符串,同时过滤出可读的可打印文本对吧?我之前在项目里也经常碰到这类场景,给你整理了两个实用的工具方法,直接就能集成到你的代码里!

1. 字节数组转十六进制字符串

这个需求的核心是把每个字节转换成两位十六进制字符,要注意Java的byte是带符号类型(范围-128到127),所以转成int时得通过& 0xFF把它转为无符号的0-255范围值,避免出现负数的十六进制表示。

public class ByteFormatter {
    // 字节数组转十六进制字符串,每个字节用两位十六进制表示,空格分隔
    public static String toHexString(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            // 将带符号字节转为无符号int值
            int unsignedByte = b & 0xFF;
            // 转十六进制,不足两位补前导0
            String hex = Integer.toHexString(unsignedByte);
            if (hex.length() == 1) {
                sb.append('0');
            }
            sb.append(hex.toLowerCase()); // 换成toUpperCase()可输出大写十六进制
            sb.append(' ');
        }
        // 移除末尾多余的空格
        return sb.substring(0, sb.length() - 1);
    }
}

举个例子,输入new byte[]{0x48, 0x65, 0x6C, 0x6C, 0x6F, (byte)0xFF},输出会是:48 65 6c 6c 6f ff。

2. 字节数组转可打印文本形式

这里的关键是过滤掉不可打印的控制字符,用统一占位符(比如.)替代,让输出更易读。你可以根据需求选择两种判断逻辑:

方式一:仅保留ASCII可打印字符(推荐)

只显示ASCII码32-126范围内的字符(空格、字母、数字、常用符号),其他字符用.代替,和大部分十六进制编辑器的显示逻辑一致:

public class ByteFormatter {
    // 上面的toHexString方法...

    // 字节数组转可打印文本,仅保留ASCII可打印字符,其余用'.'替代
    public static String toPrintableString(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            char c = (char) b;
            // 判断是否为ASCII可打印字符
            if (c >= 32 && c <= 126) {
                sb.append(c);
            } else {
                sb.append('.');
            }
        }
        return sb.toString();
    }
}

方式二:保留所有Unicode可打印字符

如果需要支持扩展字符(比如某些特殊符号),可以用Character.isPrintable()判断:

// 字节数组转可打印文本,保留所有Unicode可打印字符,其余用'.'替代
public static String toPrintableString(byte[] bytes) {
    if (bytes == null || bytes.length == 0) {
        return "";
    }
    StringBuilder sb = new StringBuilder();
    for (byte b : bytes) {
        char c = (char) b;
        if (Character.isPrintable(c)) {
            sb.append(c);
        } else {
            sb.append('.');
        }
    }
    return sb.toString();
}

测试示例

public static void main(String[] args) {
    byte[] testBytes = new byte[]{0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, (byte)0x00, (byte)0x0A, (byte)0xFF};
    System.out.println("十六进制形式:");
    System.out.println(toHexString(testBytes));
    System.out.println("\n可打印文本形式:");
    System.out.println(toPrintableString(testBytes));
}

输出结果:

十六进制形式:
48 65 6c 6c 6f 20 00 0a ff

可打印文本形式:
Hello ...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:59:30