Utf 8 转换字节时,java.lang.NumberFormatException或java.nio.BufferUnderflowException
我玩了一些字符串->字节->二进制代码,我希望我的代码适用于任何字节[]数组,目前它只适用于,我不确定ascii 中国人不工作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[]
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的字节转换回字符串
(其中包含Unicodechar
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");