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

