strtab.java

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

JAVA
100
字号
/*
 * $Id: StrTab.java,v 1.1 2003/11/25 11:54:01 epr Exp $
 */
package org.jnode.linker;

import java.util.HashMap;
import java.util.Iterator;

/**
 * @author epr
 */
public class StrTab {
	
	/** (String, Index)* */
	private final HashMap str2addr = new HashMap();
	/** (Index, String)* */
	private final HashMap addr2str = new HashMap();
	private int maxIndex;
	
	/**
	 * Create a new instance
	 */
	public StrTab() {
		maxIndex = 1;
	}
	
	/**
	 * Create a new instance and initialize from the given byte array
	 */
	public StrTab(byte[] data, int length) {
		final int cnt = length;
		int addr = 0;
		while (addr < cnt) {
			int size = 0;
			while ((addr + size < cnt) && (data[addr + size] != 0)) {
				size++;
			}
			final String s = new String(data, addr, size);
			final Integer index = new Integer(addr);
			str2addr.put(s, index);
			addr2str.put(index, s);
			addr += (size + 1);
		}
		maxIndex = cnt;
	}
	
	/**
	 * Add a string and return its index
	 * @param v
	 */
	public int addString(String v) {
		int addr = findString(v);
		if (addr < 0) {
			addr = maxIndex;
			maxIndex += (v.length() + 1);
			final Integer index = new Integer(addr);
			str2addr.put(v, index);
			addr2str.put(index, v);
		}
		return addr;
	}
	
	/**
	 * Gets the String at a given index
	 * @param index
	 */
	public String getString(int index) {
		return (String)addr2str.get(new Integer(index));
	}
	
	/**
	 * Return the index of a given string, or -1 if not found
	 */
	public int findString(String v) {
		final Integer addr = (Integer)str2addr.get(v);
		if (addr != null) {
			return addr.intValue();
		} else {
			return -1;
		}
	}
	
	/**
	 * Convert to a strtab formatted byte array.
	 * @return This strtab as elf strtab section.
	 */
	public byte[] toByteArray() {
		final byte[] data = new byte[maxIndex];
		for (Iterator i = addr2str.keySet().iterator(); i.hasNext(); ) {
			final Integer index = (Integer)i.next();
			final String str = (String)addr2str.get(index);
			final int addr = index.intValue();
			for (int k = 0; k < str.length(); k++) {
				data[addr+k] = (byte)str.charAt(k);
			}
		}
		return data;
	}
}

⌨️ 快捷键说明

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