package net.varkhan.base.conversion.character; /** * <b></b>. * <p/> * * @author varkhan * @date 1/11/15 * @time 4:05 PM */ public class AsciiString implements CharSequence, java.io.Serializable { protected final byte[] data; public AsciiString() { data = new byte[0]; } public AsciiString(byte[] data, int start, int end) { this(data, start, end, true); } public AsciiString(byte[] data, int start, int end, boolean squash) { this(data, start, end, squash?0x7F:0xFF); } protected AsciiString(byte[] data, int start, int end, int mask) { this.data= new byte[end-start]; for(int i=start,j=0; i<end; i++, j++) { this.data[j] = (byte)(mask&data[i]); } } public AsciiString(byte[] data) { this(data, 0, data.length); } public AsciiString(char[] chars) { this(chars, 0, chars.length); } public AsciiString(char[] chars, int start, int end) { this(chars, start, end, true); } public AsciiString(char[] chars, int start, int end, boolean squash) { this(chars, start, end, squash?0x7F:0xFF); } protected AsciiString(char[] chars, int start, int end, int mask) { this.data= new byte[end-start]; for(int i=start,j=0; i<end; i++, j++) { this.data[j] = (byte)(mask&chars[i]); } } public AsciiString(CharSequence str) { this(str,0,str.length(),0x7F); } public AsciiString(CharSequence str, boolean squash) { this(str,0,str.length(), squash?0x7F:0xFF); } protected AsciiString(CharSequence str, int start, int end, int mask) { this.data= new byte[end-start]; for(int i=start,j=0; i<end; i++, j++) { this.data[j] = (byte)(mask&str.charAt(i)); } } @Override public int length() { return data.length; } @Override public char charAt(int index) { return (char)(0xFF&data[index]); } @Override public AsciiString subSequence(int start, int end) { return new AsciiString(data, start, end, 0xFF); } @Override public boolean equals(Object o) { if(this==o) return true; if(!(o instanceof CharSequence)) return false; CharSequence that=(CharSequence) o; if(that.length()!=data.length) return false; for(int i=0; i<data.length; i++) { if(that.charAt(i)!=(0xFF&data[i])) return false; } return true; } @Override public int hashCode() { int h = 0; for(byte c: data) h=31*h+c; return h; } @Override public String toString() { char[] s = new char[data.length]; for(int i=0; i<data.length; i++) s[i] = (char)(0xFF&data[i]); return new String(s); } public byte[] getBytes() { return data.clone(); } public int indexOf(int chr) { return indexOf(chr,0); } public int indexOf(int chr, int pos) { for(int i=pos; i<data.length; i++) if((0xFF&data[i])==chr) return i; return -1; } public int indexOf(CharSequence str) { return indexOf(str, 0); } public int indexOf(CharSequence str, int pos) { final int clen = str.length(); match: for(int i=pos; i<data.length; i++) { for(int p=0; p<clen; p++) { if(i+p>data.length) return -1; if((char)(0xFF&data[i+p])!=str.charAt(p)) continue match; } return i; } return -1; } }