Utf 8 转换字节时,java.lang.NumberFormatException或java.nio.BufferUnderflowException

Utf 8 转换字节时,java.lang.NumberFormatException或java.nio.BufferUnderflowException,utf-8,binary,byte,Utf 8,Binary,Byte,我玩了一些字符串->字节->二进制代码,我希望我的代码适用于任何字节[]数组,目前它只适用于,我不确定ascii 中国人不工作 String message =" 汉语"; playingWithFire(message.getBytes()); 而字符串wow=“wow…”;工作:(我希望它能适用于所有utf-8格式。有没有关于如何做到这一点的建议 //谢谢 public static byte[] playingWithFire(byte[] bytes){ byte[]

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

中国人不工作

String message =" 汉语";
    playingWithFire(message.getBytes());
而字符串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;
}
publicstaticbyte[]playingWithFire(byte[]bytes){
字节[]新字节=null;
新字节=新字节[bytes.length];
for(int i=0;i
message.getBytes()在您的案例中,正在尝试使用计算机上的默认字符集将中文Unicode字符转换为字节。如果是西文字符集,则可能会出错

请注意,
String.getBytes()
还有另一种形式,即
String.getBytes(String)
,其中字符串是用于将字符串字符转换为字节的字符编码的名称

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

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

String message =" 汉语";
byte[] utf16Bytes = message.getBytes("utf-16");
替换要使用的任何编码的名称

类似地,
newstring(String,byte[])
constructor可以获取以某种方式编码的字节数组,并且在给定字符串的情况下,可以将这些字节转换为Unicode字符

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


因为我不知道你说的“二进制代码”是什么意思在上面,我不能再深入了。在我看来,Unicode字符中有一个二进制代码,一个接一个地表示字符。此外,字节数组中有一个二进制代码,表示具有多个字节对一个字符表示的字符。如果要以某种方式加密字节数组,请使用标准的、经验证的加密方法od和经过时间验证的程序来保护内容。

Java
char
类型包含Unicode字符。在
char
和'byte'之间移动时,需要一个合适的编码器,以使字节数组成为有用的编码之一。(例如,Big5、UTF-8、UTF-16等)所以存储为byte,但操作为char。我应该如何使用:Charset encoding=Charset.forName(“UTF-16”);?Ofc我必须像这样使用它。getBytes(encoding)但它仍然不能解决问题:(注意,我的问题是为什么我不能转换表示ex的字符串二进制文件,汉语 到字节/字节[]。我知道加密内容的标准方法,因此我只需要能够以某种方式转换字节。如果您有更好的方法将字节[]转换为二进制重新筛选,请共享。或者如果您知道将二进制表示转换回字节[]的方法:)请注意此问题的答案()它们总是以字节数组(或转换为字节数组的字符串)开始。如果将字节数组改为二进制,然后再改回字节,它只是一个循环。如果有一个包含数据的字节数组,就按原样使用它。
String newMessage = new String(utf16Bytes, "utf-16");