需要一些帮助确保我的ByteUtil类准确

时间:2015-10-03 20:49:38

标签: java byte bytearray

我不太熟悉字节的所有含义甚至接近字符集,只是因为我没有经常使用它们。但是我正在开发一个项目,我需要将每个Java基元类型(和字符串)从字节转换为AND。我希望他们都使用字符集UTF-8,但我不确定我是否正确转换它们。

无论如何,虽然我非常确定所有来自/来自字节转换的数字都是正确的,但是再一次,我需要100%确定。如果某人对使用数字和字符集的字节有很好的经验,你可以查看下面的课程,并指出任何问题吗?

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));
        }
}

此外,所有输入和返回的数据都是由我的内部源读取的,例如布尔转换可能是也可能不是这样做的正确方法,但在布尔情况下,它不重要因为我知道我要检查的是什么。

1 个答案:

答案 0 :(得分:3)

你甚至不需要这样做。您可以使用DataOutputStream将基本类型和字符串写入ByteArrayOutputStream。然后,您可以使用toByteArray()获取放入ByteArrayInputStreambyte[]。您可以将InputStream包裹在DataInputStream中以取回原语。

如果您正在完成学校作业,您需要自己实施(这听起来像是一项愚蠢的任务),您可以在{{3}上查找ByteArrayOutputStreamByteArrayInputStream的实施}。复制/粘贴是一个坏主意,但它可能会给你一些关于要考虑的注意事项的提示。