Switched to a better base64 encoding and decoding method.

This commit is contained in:
Kristian S. Stangeland 2013-01-09 07:05:36 +01:00
parent f791e2726f
commit 0597084c3d
2 changed files with 27 additions and 55 deletions

View File

@ -6,9 +6,8 @@ import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.math.BigInteger;
import org.bukkit.inventory.ItemStack;
import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder;
import com.comphenix.protocol.reflect.FuzzyReflection;
@ -50,21 +49,15 @@ public class StreamSerializer {
}
/**
* Deserialize an item stack from a base-32 encoded string.
* @param input - base-32 encoded string.
* Deserialize an item stack from a base-64 encoded string.
* @param input - base-64 encoded string.
* @return A deserialized item stack.
* @throws IOException If the operation failed due to reflection or corrupt data.
*/
public ItemStack deserializeItemStack(String input) throws IOException {
try {
BigInteger base32 = new BigInteger(input, 32);
ByteArrayInputStream inputStream = new ByteArrayInputStream(base32.toByteArray());
return deserializeItemStack(new DataInputStream(inputStream));
} catch (NumberFormatException e) {
throw new IOException("Input is not valid base 32.", e);
}
ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(input));
return deserializeItemStack(new DataInputStream(inputStream));
}
/**
@ -93,9 +86,9 @@ public class StreamSerializer {
}
/**
* Serialize an item stack as a base-32 encoded string.
* Serialize an item stack as a base-64 encoded string.
* @param stack - the item stack to serialize.
* @return A base-32 representation of the given item stack.
* @return A base-64 representation of the given item stack.
* @throws IOException If the operation fails due to reflection problems.
*/
public String serializeItemStack(ItemStack stack) throws IOException {
@ -105,6 +98,6 @@ public class StreamSerializer {
serializeItemStack(dataOutput, stack);
// Serialize that array
return new BigInteger(1, outputStream.toByteArray()).toString(32);
return Base64Coder.encodeLines(outputStream.toByteArray());
}
}

View File

@ -5,7 +5,8 @@ import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder;
import com.comphenix.protocol.wrappers.nbt.NbtBase;
import com.comphenix.protocol.wrappers.nbt.NbtCompound;
@ -13,36 +14,28 @@ import com.comphenix.protocol.wrappers.nbt.NbtList;
import com.comphenix.protocol.wrappers.nbt.NbtWrapper;
/**
* Serializes NBT to a base N (default 32) encoded string and back.
* Serializes NBT to a base-64 encoded string and back.
*
* @author Kristian
*/
public class NbtTextSerializer {
/**
* The default radix to use while converting to text.
*/
public static final int STANDARD_BASE = 32;
/**
* A default instance of this serializer.
*/
public static final NbtTextSerializer DEFAULT = new NbtTextSerializer();
private NbtBinarySerializer binarySerializer;
private int baseRadix;
public NbtTextSerializer() {
this(new NbtBinarySerializer(), STANDARD_BASE);
this(new NbtBinarySerializer());
}
/**
* Construct a serializer with a custom binary serializer and base radix.
* Construct a serializer with a custom binary serializer.
* @param binary - binary serializer.
* @param baseRadix - base radix in the range 2 - 32.
*/
public NbtTextSerializer(NbtBinarySerializer binary, int baseRadix) {
public NbtTextSerializer(NbtBinarySerializer binary) {
this.binarySerializer = binary;
this.baseRadix = baseRadix;
}
/**
@ -54,17 +47,9 @@ public class NbtTextSerializer {
}
/**
* Retrieve the base radix.
* @return The base radix.
*/
public int getBaseRadix() {
return baseRadix;
}
/**
* Serialize a NBT tag to a String.
* Serialize a NBT tag to a base-64 encoded string.
* @param value - the NBT tag to serialize.
* @return The NBT tag in base N form.
* @return The NBT tag in base-64 form.
*/
public <TType> String serialize(NbtBase<TType> value) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
@ -73,30 +58,24 @@ public class NbtTextSerializer {
binarySerializer.serialize(value, dataOutput);
// Serialize that array
return new BigInteger(1, outputStream.toByteArray()).toString(baseRadix);
return Base64Coder.encodeLines(outputStream.toByteArray());
}
/**
* Deserialize a NBT tag from a base N encoded string.
* @param input - the base N string.
* Deserialize a NBT tag from a base-64 encoded string.
* @param input - the base-64 string.
* @return The NBT tag contained in the string.
* @throws IOException If we are unable to parse the input.
*/
public <TType> NbtWrapper<TType> deserialize(String input) throws IOException {
try {
BigInteger baseN = new BigInteger(input, baseRadix);
ByteArrayInputStream inputStream = new ByteArrayInputStream(baseN.toByteArray());
return binarySerializer.deserialize(new DataInputStream(inputStream));
} catch (NumberFormatException e) {
throw new IOException("Input is not valid base " + baseRadix + ".", e);
}
ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(input));
return binarySerializer.deserialize(new DataInputStream(inputStream));
}
/**
* Deserialize a NBT compound from a base N encoded string.
* @param input - the base N string.
* Deserialize a NBT compound from a base-64 encoded string.
* @param input - the base-64 string.
* @return The NBT tag contained in the string.
* @throws IOException If we are unable to parse the input.
*/
@ -107,8 +86,8 @@ public class NbtTextSerializer {
}
/**
* Deserialize a NBT list from a base N encoded string.
* @param input - the base N string.
* Deserialize a NBT list from a base-64 encoded string.
* @param input - the base-64 string.
* @return The NBT tag contained in the string.
* @throws IOException If we are unable to parse the input.
*/