package org.apache.thrift;
public final class Utf8Helper {
private Utf8Helper() {}
public static final int getByteLength(final String s) {
int byteLength = 0;
int c;
for (int i = 0; i < s.length(); i++) {
c = s.charAt(i);
if (c <= 0x007F) {
byteLength++;
} else if (c > 0x07FF) {
byteLength+=3;
} else {
byteLength+=2;
}
}
return byteLength;
}
public static byte[] encode(String s) {
byte[] buf = new byte[getByteLength(s)];
encode(s, buf, 0);
return buf;
}
public static void encode(String s, byte[] buf, int offset) {
int nextByte = 0;
int c;
for (int i = 0; i < s.length(); i++) {
c = s.charAt(i);
if (c <= 0x007F) {
buf[offset + nextByte] = (byte)c;
nextByte++;
} else if (c > 0x07FF) {
buf[offset + nextByte ] = (byte)(0xE0 | c >> 12 & 0x0F);
buf[offset + nextByte + 1] = (byte)(0x80 | c >> 6 & 0x3F);
buf[offset + nextByte + 2] = (byte)(0x80 | c & 0x3F);
nextByte+=3;
} else {
buf[offset + nextByte ] = (byte)(0xC0 | c >> 6 & 0x1F);
buf[offset + nextByte + 1] = (byte)(0x80 | c & 0x3F);
nextByte+=2;
}
}
}
public static String decode(byte[] buf) {
return decode(buf, 0, buf.length);
}
public static String decode(byte[] buf, int offset, int byteLength) {
int charCount = 0;
char[] chars = new char[byteLength];
int c;
int byteIndex = offset;
int charIndex = 0;
while (byteIndex < offset + byteLength) {
c = buf[byteIndex++] & 0xFF;
switch (c >> 4) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
chars[charIndex++] = (char) c;
break;
case 12:
case 13:
chars[charIndex++] = (char) ((c & 0x1F) << 6 | (buf[byteIndex++] & 0x3F));
break;
case 14:
chars[charIndex++] = (char) ((c & 0x0F) << 12 | (buf[byteIndex++] & 0x3F) << 6 | (buf[byteIndex++] & 0x3F) << 0);
break;
}
charCount++;
}
return new String(chars, 0, charCount);
}
}