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

Java中小端序十六进制字符串转int的正确实现方法

小端序十六进制字符串转无符号16位整数的Java正确实现

十六进制字符串"c4d2"是采用小端序编码的16位无符号整数,对应十进制值53956。Python可以通过int.from_bytes直接得到正确结果,但Java中直接用getShort()会得到负数,这是因为Java的short是有符号类型,无法表示超过32767的无符号值。

错误原因分析

Java的short类型是16位有符号整数,范围为-32768到32767。53956超出了这个范围,所以ByteBuffer.getShort()返回的是该值对应的补码负数-11580,而非预期的无符号整数。

正确实现方法

方法1:利用Short.toUnsignedInt()转换

先通过ByteBuffer按小端序读取有符号short,再调用Short.toUnsignedInt()将其转换为无符号int值:

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays;
import java.util.HexFormat;

public class HexConversion {
    public static void main(String[] args) {
        String hexStr = "c4d2";
        byte[] bytes = HexFormat.of().parseHex(hexStr);
        
        short signedValue = ByteBuffer.wrap(bytes)
                                     .order(ByteOrder.LITTLE_ENDIAN)
                                     .getShort();
        int unsignedValue = Short.toUnsignedInt(signedValue);
        
        System.out.printf("%s -> %s -> %d%n", hexStr, Arrays.toString(bytes), unsignedValue);
    }
}

输出:

c4d2 -> [-60, -46] -> 53956

方法2:手动计算无符号值

直接处理字节的无符号表示(通过& 0xFF将有符号byte转为0-255的无符号值),再按小端序拼接计算:

import java.util.Arrays;
import java.util.HexFormat;

public class HexConversionManual {
    public static void main(String[] args) {
        String hexStr = "c4d2";
        byte[] bytes = HexFormat.of().parseHex(hexStr);
        
        // 小端序:第一个字节是低8位,第二个字节是高8位
        int unsignedValue = (bytes[0] & 0xFF) | ((bytes[1] & 0xFF) << 8);
        
        System.out.printf("%s -> %s -> %d%n", hexStr, Arrays.toString(bytes), unsignedValue);
    }
}

输出:

c4d2 -> [-60, -46] -> 53956

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:32:24