java int 4个字节_将4个字节转换为int
一、背景
在Java手写JVM时,需要读取 .class
后缀的字节码文件。当把字节码文件以 byte[]
(比特数组)的形式读取到内存中时,数组前四个字节为 0xCAFEBABE
。
如何判断我读取的四个字节的值等于 0xCAFEBABE
呢?
二、单个字节转int
2.1 正确代码
public class Test {
public static void main(String[] args) {
int ca = (byte)0xca;
int fe = (byte)0xfe;
int ba = (byte)0xba;
int be = (byte)0xbe;
System.out.println(ca);
System.out.println(fe);
System.out.println(ba);
System.out.println(be);
}
}
输出结果:
-54 -2 -70 -66
2.2 错误示例
int ca = 0xca; // 值为 202
2.3 错误原因分析
0xca
转化为二进制为 11001010
int
型占4个字节:
十进制 | 二进制(双字) |
---|---|
-54 | 1111 1111 1111 1111 1111 1111 1100 1010 |
202 | 0000 0000 0000 0000 0000 0000 1100 1010 |
表格中数据的正确性,可以借助 Windows 系统的计算器来表示:
长度占1个字节的byte转化为长度为4个字节的int,高位补充和符号位相同的值,可以保持值的不变。
如果是负数,符号位为1,扩展位数时,高位补1:
负数 | 原码 | 补码 | 扩展为32位补码 | 32位原码 | 结果 |
---|---|---|---|---|---|
-54 | 1011 0110 | 1100 1010 | 1111 1111 1111 1111 1111 1111 1100 1010 | 1000 0000 0000 0000 0000 0000 0011 0110 | -54 |
但是,如果直接声明为整型,则直接把 1100 1010 作为低8位,剩余高32位全是 0。
三、字节数组转int
有了第二节的结论,我们这里可以用int来表示字节。
public class Test {
public static void main(String[] args) {
byte[] cafebabe = new byte[]{-54,-2,-70,-66};
int result = toInt(cafebabe);
System.out.println(Integer.toHexString(result));
}
private static int toInt(byte[] bytes) {
int result = 0;
for (int i = 0; i < 4; i++) {
result <<= 8;
result |= bytes[i] & 0xFF;
}
return result;
}
}
输出结果:
cafebabe
说明这里的 toInt
方法是正确的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix