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

