package com.donaldy.jvm.loader; import com.donaldy.jvm.util.Util; import java.util.Arrays; public class ByteCodeIterator { byte[] codes; int pos = 0; ByteCodeIterator(byte[] codes) { this.codes = codes; } public byte[] getBytes(int len) { if (pos + len >= codes.length) { throw new ArrayIndexOutOfBoundsException(); } byte[] data = Arrays.copyOfRange(codes, pos, pos + len); pos += len; return data; } public int nextU1toInt() { return Util.byteToInt(new byte[] { codes[pos++] }); } public int nextU2ToInt() { return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); } public int nextU4ToInt() { return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); } public String nextU4ToHexString() { return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); } public String nextUxToHexString(int len) { byte[] tmp = new byte[len]; for (int i = 0; i < len; i++) { tmp[i] = codes[pos++]; } return Util.byteToHexString(tmp).toLowerCase(); } public void back(int n) { this.pos -= n; } ///////////////////////Backup////////////////// /*private byte[] codes; private int pointer = 0; public ByteCodeIterator(byte[] codes) { this.codes = codes; } public String nextU4ToHexString() { byte [] byteCodes = nextLenByte(4); return Util.byteToHexString(byteCodes); } public int nextU2ToInt() { byte [] byteCodes = nextLenByte(2); return Util.byteToInt(byteCodes); } public int nextU1toInt() { byte [] byteCodes = nextLenByte(1); return Util.byteToInt(byteCodes); } public byte[] getBytes(int len) { byte [] byteCodes = nextLenByte(len); return byteCodes; } private byte[] nextLenByte(int len) { if (this.pointer + len >= this.codes.length) throw new IndexOutOfBoundsException("codes.length : " + this.codes.length); byte [] byteCodes = new byte[len]; for (int i = 0 ; i < len; ++i) { byteCodes[i] = this.codes[pointer ++]; } return byteCodes; }*/ }