转换字节时的java.lang.NumberFormatException或java.nio.BufferUnderflowException

时间:2013-09-04 21:27:56

标签: utf-8 binary byte

我玩了一些String - >字节 - >二进制代码,我希望我的代码适用于任何byte []数组,目前它只适用于,我不确定ascii?

中国人的工作。

String message =" 汉语";
    playingWithFire(message.getBytes());

while String wow =“WOW ......”;作品:(我希望它适用于所有utf-8格式。有关如何做到这一点的任何指示?

//感谢

public static byte[] playingWithFire(byte[] bytes){
    byte[] newbytes = null;

        newbytes = new byte[bytes.length];
        for(int i = 0; i < bytes.length; i++){
            String tempStringByte = String.format("%8s", Integer.toBinaryString(bytes[i] & 0xFF)).replace(' ', '0');

            StringBuffer newByteBrf = null;

                newByteBrf = new StringBuffer();
                for(int x = 0; x < tempStringByte.length(); x++){
                    newByteBrf.append(tempStringByte.charAt(x));
                }
                /*short a = Short.parseShort(newByteBrf.toString(), 2);
                ByteBuffer bytesads = ByteBuffer.allocate(2).putShort(a);
                newbytes[i] = bytesads.get();
                cause: java.nio.BufferUnderflowException
                */
                //cause: java.lang.NumberFormatException: Value out of range.
                newbytes[i] = Byte.parseByte(newByteBrf.toString(), 2);

            }
    return newbytes;
}

1 个答案:

答案 0 :(得分:0)

在您的情况下,

message.getBytes()尝试使用计算机上的默认字符集将中文Unicode字符转换为字节。如果它是西方的字符集,那就错了。

请注意,String.getBytes()有另一个带有String.getBytes(String)的表单,其中字符串是用于将字符串的字符转换为字节的字符编码的名称。

char类型将保留Unicode。 byte类型仅保存8个组中的原始位。

因此,要将Unicode字符串转换为编码为UTF-16的字节,您可以使用以下代码:

String message =" 汉语";
byte[] utf16Bytes = message.getBytes("utf-16");

替换您要使用的任何编码的名称。

类似地,new String(String, byte[])构造函数可以采用以某种方式编码的字节数组,并且在给定String的情况下,可以将这些字节转换为Unicode字符。

例如:如果要将上面编码为utf-16的那些字节转换回String(其中包含Unicode char):

String newMessage = new String(utf16Bytes, "utf-16");

由于我不知道上面的“二进制代码”是什么意思,我不能再往前走了。正如我所看到的,Unicode字符在其中有一个二进制代码,它们逐个表示字符。字节数组中还有一个二进制代码,表示具有多字节到一个字符表示的字符。如果您想以某种方式加密字节数组,请使用经过验证的标准加密方法和经过验证的经过时间检验的程序来保护内容。