游乐游手机版
首页/编程语言/文章详情

Java Byte与Hex互转的几种实现方法

时间:2026-07-23 21:22
Java中byte转Hex需用&0xFF清除高24位符号扩展,避免负数转换错误,并补0保证两位字符;Hex转byte时需处理奇数长度字符串,在前面补0使长度为偶数,再按两位一组转换。

Java Byte Hex转换

不少人在处理Java字节与十六进制转换时,常会遇到一个关键细节:为什么byte转Hex要用“& 0xFF”?这背后隐藏着Java数据类型的特性与常见陷阱。下面通过图示直观理解。

ja va之ByteHex转换实现方式

字节(byte)转十六进制(Hex)详解

先介绍单个字节转Hex的核心逻辑。Java中的byte类型是有符号的,取值范围为-128到127,而十六进制Hex是无符号表示。若直接使用Integer.toHexString(),负数会扩展为32位整数,导致结果错误。因此需要执行“& 0xFF”操作,将高24位清零,仅保留低8位,即原始字节的真实值。

另一个细节:十六进制通常以两位字符表示,如0A、FF。若转换后的值小于16(例如10对应A),则只得到一个字符,容易与相邻字符串混淆。例如字符串“11”可能代表两个字节1和1,或一个字节11。因此必须补0,确保结果始终为两位。代码实现如下:

/**
     * Byte转Hex
     * @param b 字节
     * @return Hex
     */
    public static String byteToHex(byte b)
    {
        String hexString = Integer.toHexString(b & 0xFF);
        //十六进制由0~9、A~F表示1~16,若Byte转Hex后结果小于16,则仅得到一个字符(如A=10)。通常使用两个字符表示十六进制位,
        //若只有一个字符,遇到字符串“11”时,无法区分是1和1两个字节还是11一个字节。补0后,1和1变为0101,11则明确表示一个字节。
        if (hexString.length() < 2)
        {
            hexString = new StringBuilder(String.valueOf(0)).append(hexString).toString();
        }
        return hexString.toUpperCase();
    }

字节数组(byte[])转十六进制(Hex)实现

批量转换的实现相对简单:遍历字节数组,对每个字节调用上述方法,再拼接结果。需注意处理null和空数组的情况,代码中已做了周全判断:

/**
     * 字节数组转Hex
     * @param bytes 字节数组
     * @return Hex
     */
    public static String bytesToHex(byte[] bytes)
    {
        StringBuffer sb = new StringBuffer();
        if (bytes != null && bytes.length > 0)
        {
            for (int i = 0; i < bytes.length; i++) {
                String hex = byteToHex(bytes[i]);
                sb.append(hex);
            }
        }
        return sb.toString();
    }

十六进制(Hex)转字节(byte)反向转换

反向转换更为直接:使用Integer.parseInt()解析字符串,再强制转换为byte。注意parseInt接收的字符串需为合法十六进制,例如“A”或“FF”:

/**
     * Hex转Byte字节
     * @param hex 十六进制字符串
     * @return 字节
     */
    public static byte hexToByte(String hex)
    {
        return (byte) Integer.parseInt(hex,16);
    }

十六进制(Hex)转字节数组(byte[])注意事项

批量转换时存在一个常见陷阱:Hex字符串长度可能为奇数。例如“A”实际表示0x0A,但若直接按两位一组截取会出错。因此代码先判断长度,若为奇数则在前面补0,确保长度为偶数。然后每两位一组调用上述方法转换为字节,依次存入数组:

/**
     * Hex转Byte字节数组
     * @param hex 十六进制字符串
     * @return 字节数组
     */
    public static byte[] hexToBytes(String hex)
    {
        int hexLength = hex.length();
        byte[] result;
        //判断Hex字符串长度,若为奇数需在前边补0以保证长度为偶数
        //因为Hex字符串通常为两个字符,截取时按两位一组转换为Byte
        if (hexLength % 2 ==1)
        {
            //奇数
            hexLength++;
            hex = "0"+hex;
        }
        result = new byte[(hexLength/2)];
        int j = 0;
        for (int i = 0; i < hexLength; i+=2) {
            result[j] = hexToByte(hex.substring(i,i+2));
            j++;
        }
        return result;
    }

总结与要点

综上所述,Byte与Hex互转的核心在于正确处理符号位扩展与长度对齐。在日常开发中,可将上述代码封装为工具类直接复用。关键要点仅两个:转Hex时务必使用“& 0xFF”,转回Byte时注意奇数长度补0。掌握这些要点,即可避免常见错误。

来源:https://www.jb51.net/program/367889lhv.htm
上一篇MyBatis-Plus自定义复杂排序逻辑实现详解 下一篇C++向Excel文件写入数据的实现方法
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
FileZilla断点续传设置与操作指南
编程语言 · 2026-07-25

FileZilla断点续传设置与操作指南

FileZilla支持断点续传,需客户端与服务器均开启REST命令。设置中确保启用断点续传及继续传输选项。中断后自动或手动从断点恢复。注意服务器支持、传输模式匹配及文件完整性校验。

Debian系统C++编译器位置查找方法
编程语言 · 2026-07-25

Debian系统C++编译器位置查找方法

在Debian系统中,通过apt安装的C++编译器g++默认位于 usr bin g++,可使用which或whereis命令验证路径。g++属于build-essential软件包,若未安装则需执行sudoaptinstallbuild-essential。该包还包含gcc、make等编译工具链,g++是GNUC++编译器,实际是符号链接指向具体版本,验证

Debian系统安装C++环境的方法
编程语言 · 2026-07-25

Debian系统安装C++环境的方法

在Debian系统安装C++开发环境:先sudoaptupdate更新包列表,再sudoaptinstallbuild-essential安装编译工具链,或单独安装g++。用g++--version验证。可选安装VSCode、GDB、CMake等工具并配置默认编译器版本。

Debian系统C++开发环境配置指南
编程语言 · 2026-07-25

Debian系统C++开发环境配置指南

在Debian系统中,先执行aptupdate更新软件包列表,再安装build-essential元包即可获得GCC、G++、Make和GDB。通过运行g++--version命令验证编译器安装成功。可选安装VisualStudioCode、CLion等编辑器及CMake构建工具,并编写一个简单的HelloWorld程序,使用g++编译运行以验证环境配置正确

通过cpustat工具查看CPU状态的具体方法与详细步骤
编程语言 · 2026-07-25

通过cpustat工具查看CPU状态的具体方法与详细步骤

cpustat是sysstat包中的CPU监控工具,可按固定间隔输出带时间戳的CPU使用率统计。安装后运行cpustat即可实时显示各核心信息,常用指标包括%usr、%sys、%iowait、%steal和%idle,用于定位用户态、内核态或I O瓶颈。高级选项-c可显示单核统计,-m可同时查看内存使用,适合脚本采集和性能分析。