package org.xukai.jvm.loader; import com.google.common.base.Charsets; import com.google.common.base.Preconditions; import org.xukai.jvm.constant.ConstantPool; import org.xukai.jvm.util.Util; import java.util.Arrays; public class ByteCodeIterator { private byte[] bytes; private int offset; public ByteCodeIterator(byte[] bytes,int offset) { this.bytes = bytes; this.offset = offset; } public int nextToInt(int length){ Preconditions.checkArgument(length > 0); if ((offset + length) < bytes.length) { int i = Util.byteToInt(Arrays.copyOfRange(bytes, offset, offset + length)); offset = offset + length; return i; } return -1; } public int preToInt(int length){ Preconditions.checkArgument(length > 0); if ((offset - length) > 0) { int i = Util.byteToInt(Arrays.copyOfRange(bytes, offset - length, offset)); offset = offset - length; return i; } return -1; } public String nextToString(int length){ Preconditions.checkArgument(length > 0); if ((offset + length) < bytes.length) { String str = Util.byteToHexString(Arrays.copyOfRange(bytes,offset,offset + length)); offset = offset + length; return str; } return null; } public String nextToUTF(int length){ Preconditions.checkArgument(length > 0); if ((offset + length) < bytes.length) { String str = new String(Arrays.copyOfRange(bytes,offset,offset + length), Charsets.UTF_8); offset = offset + length; return str; } return null; } }