blob: 00ffbf161be229d201455a298556eadfda2975e7 [file] [log] [blame]
/*
**********************************************************************
* Copyright (c) 2006-2007, Google and others. All Rights Reserved.
**********************************************************************
* Author: Mark Davis
**********************************************************************
*/
package org.unicode.cldr.util;
import java.io.IOException;
/**
* Class that converts strings to bytes and back. The bytes do not have to be
* UTF-8, since they are meant to only be used serially. In particular, the only
* restriction is that the transition between serialized characters must be discoverable by
* looking at either the last byte of the first character or the first byte of the second character.
*
* @author markdavis
*
*/
public abstract class StringByteConverter {
public void clear() {
// default implementation does nothing
}
/**
* Return the maximum number of bytes per char.
*
* @return
*/
public abstract int getMaxBytesPerChar();
/**
* Converts char of source to output. Result may depend on previous context.
* Call clear() before first character, and call toBytes(output, bytePosition) after done.
*
* @param output
* buffer to fill
* @return new byte position
*/
public abstract int toBytes(char ch, byte[] output, int bytePosition);
/**
* Converts final state, if any, to output. Result may depend on previous context.
* Call clear() before first character, and call toBytes(output, bytePosition) after done.
*
* @param output
* buffer to fill
* @return new byte position
*/
public int toBytes(byte[] output, int bytePosition) {
return bytePosition; // default implementation does nothing
}
/**
* Read a string from a byte array. The byte array must be well formed; eg the
* contents from byteStart to byteLength will not cause errors, and will never
* overrun. It will always terminate at byteLength. The results are not
* guaranteed to be the same as would be gotten from inverting toBytes -- that
* will happen if multiple strings map to the same bytes.
*
* @param input
* byte array to read from
* @param byteStart
* TODO
* @param byteLength
* total length of the byte array
* @param result
* the result to add on to
* @return the result, for chaining.
* @throws IOException
*/
public abstract Appendable fromBytes(byte[] input, int byteStart,
int byteLength, Appendable result);
/**
* Write a string to a byte array.
*
* @param source
* string to write
* @param output
* byte array to write into
* @param bytePosition
* place in byte array to start
* @return new position in byte array
*/
public int toBytes(CharSequence source, byte[] output, int bytePosition) {
for (int i = 0; i < source.length(); ++i) {
bytePosition = toBytes(source.charAt(i), output, bytePosition);
}
toBytes(output, bytePosition); // cleanup
return bytePosition;
}
public byte[] toBytes(CharSequence source) {
byte[] buffer = new byte[source.length() * getMaxBytesPerChar()];
int len = toBytes(source, buffer, 0);
byte[] result = new byte[len];
System.arraycopy(buffer, 0, result, 0, len);
return result;
}
}