classreader.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 119 行

JAVA
119
字号
/*
 * $Id: ClassReader.java,v 1.1 2004/02/15 11:06:18 epr Exp $
 */
package org.jnode.vm.classmgr;


/**
 * @author Ewout Prangsma (epr@users.sourceforge.net)
 */
public final class ClassReader {
    
    private final byte[] data;
    private int pos;
    //private final int length;
    
    public ClassReader(byte[] data, int ofs, int length) {
        this.data = data;
        this.pos = ofs;
        //this.length = length;
    }

    public final void skip(int delta) {
        pos += delta;
    }

    public final int readu1() {
        final int ofs = pos;
        final int v = data[ofs] & 0xff;
        pos = ofs + 1;
        return v;
    }

    public final int readu2() {
        final int ofs = pos;
        final int v1 = data[ ofs] & 0xff;
        final int v2 = data[ ofs + 1] & 0xff;
        final int v = (v1 << 8) + v2;
        pos = ofs + 2;
        return v;
    }

    public final int readu4() {
        final int ofs = pos;
        final int v1 = data[ ofs] & 0xff;
        final int v2 = data[ ofs + 1] & 0xff;
        final int v3 = data[ ofs + 2] & 0xff;
        final int v4 = data[ ofs + 3] & 0xff;
        final int v = (v1 << 24) + (v2 << 16) + (v3 << 8) + v4;
        pos = ofs + 4;
        return v;
    }

    public final long readu8() {
        final long l0 = readu4();
        final long l1 = readu4();
        return ((l0 & 0xFFFFFFFFL) << 32) | (l1 & 0xFFFFFFFFL);
    }

    public final byte[] readBytes(int length) {
        byte[] res = new byte[ length];
        System.arraycopy(data, pos, res, 0, length);
        pos += length;
        return res;
    }

    public final char[] readUTF() {
        int utflen = readu2();
        char str[] = new char[ utflen];
        int count = 0;
        int strlen = 0;
        while (count < utflen) {
            int c = data[pos++] & 0xFF;
            int char2, char3;
            switch (c >> 4) {
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
            case 7:
                // 0xxxxxxx
                count++;
                str[ strlen++] = (char) c;
                break;
            case 12:
            case 13:
                // 110x xxxx 10xx xxxx
                count += 2;
                if (count > utflen)
                        throw new RuntimeException("Class Format Error (utf)");
                char2 = data[pos++] & 0xFF;
                if ((char2 & 0xC0) != 0x80)
                        throw new RuntimeException("Class Format Error (utf)");
                str[ strlen++] = (char) (((c & 0x1F) << 6) | (char2 & 0x3F));
                break;
            case 14:
                // 1110 xxxx 10xx xxxx 10xx xxxx
                count += 3;
                if (count > utflen)
                        throw new RuntimeException("Class Format Error (utf)");
                char2 = data[pos++] & 0xFF;
                char3 = data[pos++] & 0xFF;
                if (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80))
                        throw new RuntimeException("Class Format Error (utf)");
                str[ strlen++] = (char) (((c & 0x0F) << 12)
                        | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));
                break;
            default:
                // 10xx xxxx, 1111 xxxx
                throw new RuntimeException("Class Format Error (utf)");
            }
        }
        return new String(str, 0, strlen).intern().toCharArray();
    }

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?