ByteBuffer调试工具类

一个可以形象展示ByteBuffer内容的方法,便于调试

java 复制代码
package com.example.netty;

import java.nio.ByteBuffer;

public class ByteBufferUtil {

    /**
     * 打印ByteBuffer的内容,以十六进制和ASCII字符的形式展示。
     *
     * @param buffer 要展示的ByteBuffer
     */
    public static void debugByteBuffer(ByteBuffer buffer) {
        // 重置buffer的位置,以便从头开始读取
        buffer.rewind();

        // 用于存储十六进制字符串
        StringBuilder hexDump = new StringBuilder();
        // 用于存储ASCII字符
        StringBuilder asciiDump = new StringBuilder();

        // 一次读取一个字节
        while (buffer.hasRemaining()) {
            int byteValue = buffer.get() & 0xFF; // 确保是正数
            // 添加到十六进制字符串
            hexDump.append(String.format("%02X ", byteValue));

            // 添加到ASCII字符串,如果是不可打印的字符,则显示为点
            char ch = (char) byteValue;
            asciiDump.append((ch >= 32 && ch <= 126) ? ch : '.');

            // 每行16个字节
            if (buffer.position() % 16 == 0) {
                hexDump.append("   ").append(asciiDump);
                hexDump.append(System.lineSeparator());
                asciiDump.setLength(0); // 清空ASCII字符串
            }
        }

        // 如果最后一行不足16个字节,也打印出来
        if (asciiDump.length() > 0) {
            // 补足空格,保持对齐
            while (hexDump.length() < 48) {
                hexDump.append("   ");
            }
            hexDump.append(asciiDump);
        }

        // 打印结果
        System.out.println(hexDump.toString());
    }

    public static void main(String[] args) {
        // 示例:创建一个ByteBuffer并填充一些数据
        ByteBuffer buffer = ByteBuffer.allocate(64);
        for (int i = 0; i < buffer.capacity(); i++) {
            buffer.put((byte) i);
        }

        // 展示ByteBuffer内容
        debugByteBuffer(buffer);
    }
}

可以展现出如下结果:

相关推荐
IT 行者几秒前
Spring Security 7.0 新特性详解
java·后端·spring
思成不止于此4 分钟前
C++ STL中map与set的底层实现原理深度解析
开发语言·c++·set·map·红黑树·底层实现
华仔啊6 分钟前
Java 的金额计算用 long 还是 BigDecimal?资深程序员这样选
java·后端
惺忪97986 分钟前
C++ 构造函数完全指南
开发语言·c++
小此方8 分钟前
Re:从零开始学C++(五)类和对象·第二篇:构造函数与析构函数
开发语言·c++
秦苒&8 分钟前
【C语言】详解数据类型和变量(二):三种操作符(算数、赋值、单目)及printf
c语言·开发语言·c++·c#
无限进步_9 分钟前
【C语言&数据结构】有效的括号:栈数据结构的经典应用
c语言·开发语言·数据结构·c++·git·github·visual studio
Coder_Boy_10 分钟前
业务导向型技术日志记录(2)
java·人工智能·驱动开发·微服务
是喵斯特ya17 分钟前
python开发web暴力破解工具(进阶篇 包含验证码识别和token的处理)
开发语言·python·web安全
凤凰战士芭比Q17 分钟前
Jenkins(环境变量、构建参数、流水线触发、通知报告)
java·servlet·jenkins