需要一些帮助来确保我的 ByteUtil class 是准确的
Need some help ensuring my ByteUtil class is accurate
我不是很熟悉字节的所有含义,甚至不熟悉字符集,只是因为我不经常使用它们。然而,我正在做一个项目,我需要将每个 Java 原始类型(和字符串)转换为 AND 从字节。我希望它们都使用字符集 UTF-8,但我不确定我是否正确转换了它们。
无论如何,虽然我很确定所有数字 to/from 字节转换都是正确的,但话又说回来,我需要 100% 确定。如果有人对带数字和字符集的字节有很好的经验,你能看看下面的 class 并指出任何问题吗?
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
public class ByteUtil
{
//TO BYTES FROM PRIMITIVES & STRINGS
public static byte[] getBytes(short i)
{
return ByteBuffer.allocate(2).putInt(i).array();
}
public static byte[] getBytes(int i)
{
return ByteBuffer.allocate(4).putInt(i).array();
}
public static byte[] getBytes(long i)
{
return ByteBuffer.allocate(8).putLong(i).array();
}
public static byte getBytes(boolean i)
{
return (byte) (i ? 1 : 0);
}
public static byte[] getBytes(char i)
{
return getBytes(String.valueOf(i).trim());
}
public static byte[] getBytes(String i)
{
return i.getBytes(StandardCharsets.UTF_8);
}
public static byte[] getBytes(float i)
{
return getBytes(Float.floatToIntBits(i));
}
public static byte[] getBytes(double i)
{
return getBytes(Double.doubleToLongBits(i));
}
//TO PRIMITIVES & STRINGS FROM BYTES
public static short getShort(byte[] b)
{
ByteBuffer wrapped = ByteBuffer.wrap(b);
return wrapped.getShort();
}
public static int getInt(byte[] b)
{
ByteBuffer wrapped = ByteBuffer.wrap(b);
return wrapped.getInt();
}
public static long getLong(byte[] b)
{
ByteBuffer wrapped = ByteBuffer.wrap(b);
return wrapped.getLong();
}
public static boolean getBoolean(byte b)
{
return(b == 1 ? true : false);
}
public static char getChar(byte[] b)
{
return getString(b).trim().toCharArray()[0];
}
public static String getString(byte[] b)
{
return new String(b, StandardCharsets.UTF_8);
}
public static float getFloat(byte[] b)
{
return Float.intBitsToFloat(getInt(b));
}
public static double getDouble(byte[] b)
{
return Double.longBitsToDouble(getLong(b));
}
}
此外,所有输入和返回的数据都由我的源内部读取,例如布尔转换可能是也可能不是执行此类操作的正确方法,但在布尔情况下,这无关紧要,因为我知道我在检查什么。
您甚至不需要这样做。您可以使用 DataOutputStream to write your primitive types and Strings to a ByteArrayOutputStream. You can then use toByteArray()
to get a byte[]
that you put into a ByteArrayInputStream. You can wrap that InputStream in a DataInputStream 取回您的原语。
如果您正在做一项需要自己实现的学校作业(这听起来像是一项愚蠢的作业),您可以查看 ByteArrayOutputStream and ByteArrayInputStream on GrepCode 的实现。 Copy/pasting 是个坏主意,但它可能会给您一些提示,让您了解需要考虑的因素。
我不是很熟悉字节的所有含义,甚至不熟悉字符集,只是因为我不经常使用它们。然而,我正在做一个项目,我需要将每个 Java 原始类型(和字符串)转换为 AND 从字节。我希望它们都使用字符集 UTF-8,但我不确定我是否正确转换了它们。
无论如何,虽然我很确定所有数字 to/from 字节转换都是正确的,但话又说回来,我需要 100% 确定。如果有人对带数字和字符集的字节有很好的经验,你能看看下面的 class 并指出任何问题吗?
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
public class ByteUtil
{
//TO BYTES FROM PRIMITIVES & STRINGS
public static byte[] getBytes(short i)
{
return ByteBuffer.allocate(2).putInt(i).array();
}
public static byte[] getBytes(int i)
{
return ByteBuffer.allocate(4).putInt(i).array();
}
public static byte[] getBytes(long i)
{
return ByteBuffer.allocate(8).putLong(i).array();
}
public static byte getBytes(boolean i)
{
return (byte) (i ? 1 : 0);
}
public static byte[] getBytes(char i)
{
return getBytes(String.valueOf(i).trim());
}
public static byte[] getBytes(String i)
{
return i.getBytes(StandardCharsets.UTF_8);
}
public static byte[] getBytes(float i)
{
return getBytes(Float.floatToIntBits(i));
}
public static byte[] getBytes(double i)
{
return getBytes(Double.doubleToLongBits(i));
}
//TO PRIMITIVES & STRINGS FROM BYTES
public static short getShort(byte[] b)
{
ByteBuffer wrapped = ByteBuffer.wrap(b);
return wrapped.getShort();
}
public static int getInt(byte[] b)
{
ByteBuffer wrapped = ByteBuffer.wrap(b);
return wrapped.getInt();
}
public static long getLong(byte[] b)
{
ByteBuffer wrapped = ByteBuffer.wrap(b);
return wrapped.getLong();
}
public static boolean getBoolean(byte b)
{
return(b == 1 ? true : false);
}
public static char getChar(byte[] b)
{
return getString(b).trim().toCharArray()[0];
}
public static String getString(byte[] b)
{
return new String(b, StandardCharsets.UTF_8);
}
public static float getFloat(byte[] b)
{
return Float.intBitsToFloat(getInt(b));
}
public static double getDouble(byte[] b)
{
return Double.longBitsToDouble(getLong(b));
}
}
此外,所有输入和返回的数据都由我的源内部读取,例如布尔转换可能是也可能不是执行此类操作的正确方法,但在布尔情况下,这无关紧要,因为我知道我在检查什么。
您甚至不需要这样做。您可以使用 DataOutputStream to write your primitive types and Strings to a ByteArrayOutputStream. You can then use toByteArray()
to get a byte[]
that you put into a ByteArrayInputStream. You can wrap that InputStream in a DataInputStream 取回您的原语。
如果您正在做一项需要自己实现的学校作业(这听起来像是一项愚蠢的作业),您可以查看 ByteArrayOutputStream and ByteArrayInputStream on GrepCode 的实现。 Copy/pasting 是个坏主意,但它可能会给您一些提示,让您了解需要考虑的因素。