String to byte[] 和byte[] to String转换不成功 本帖最后由 outsinre 于 2013-04-22 19:24:42 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 运行结果:1632HOWAREYOUHHHHHH?上面的16跟编码方式有关系,如果 str.getBytes("UTF-16").length ,则返回34 为何跟编码有关系,不是java里面一个char是2字节吗,那么str转换成byte后肯定长度是2倍关系,奇怪。我现在最关心的是,如果要顶一个byte[]数组来存放str,那么这个数组应该是多长?应用场景是:str.getByte()被写入到一个OutputStream里,另一个线程从InputStream里又重新读出来了(这中间要用管道)。那么读出来时肯定要一个临时byte[]缓存。所以我必须要定义byte[]缓存大小。 java里的字母是一个字节 汉字才是两个字节 字符串转换成字节 直接用getBytes()就行 不用new一个指定大小的Byte数组 编码格式的不同,使得字符串转换为的字节不尽相同,因而字节数目也不是固定的应该通过指定的编码格式,来达到控制最终的字节数目。若使用GBK编码方式,最终的输出结果是10 20使用其他编码方式(可能是自行指定,或者是当前环境的默认编码格式),必须先要得知此编码方式的具体名称,然后查看在该编码格式下,字符串与字节是如何转换的。最终确定字符串被转换后,获取的字节数目。 String.getBytes() 返回的是默认编码格式组成的byte[]。这里的默认编码格式是通过调用Charset.defaultCharset()来决定。看JDK的代码: public static Charset defaultCharset() { if (defaultCharset == null) { synchronized (Charset.class) { java.security.PrivilegedAction pa = new GetPropertyAction("file.encoding"); String csn = (String)AccessController.doPrivileged(pa); Charset cs = lookup(csn); if (cs != null) defaultCharset = cs; else defaultCharset = forName("UTF-8"); } } return defaultCharset; }如果你没有用什么设置,从命令行运行jvm,应该会用UTF-8编码,ASCII都是一个byte,所以长度是10。GBK跟UTF-8类似,ASCII也是一个byte。至于一个char等于两个byte,那是JVM内部表示String的时候统一用UTF16BE,而getBytes()实际上也是经过转换的。 如何把GUID放入一个16位的二进制上。又如何读取一个16位的二进制回GUID 验证客户端证书的信息!!!!!!!!!!! 关于一个储存相对路径的问题,高分回赠! javaclub论坛招募“斑竹”(http://www.13u0.com) 求助:检索PDF文件并打印的问题? 我叫石東麟学計算机1年了・謝謝 请问java 中如何实现大小写不敏感的字符串替换???谢谢 熟悉jdk1.1.8的进来看哈!!!关于纵向显示文字的问题!!! 关于继承的问题 我也来散分了. 新人请教:servlet如何响应jsp里的按键 怎么把修改文件改了以后再放回去?
16
32
HOWAREYOUHHHHHH?
上面的16跟编码方式有关系,如果 str.getBytes("UTF-16").length ,则返回34
应用场景是:str.getByte()被写入到一个OutputStream里,另一个线程从InputStream里又重新读出来了(这中间要用管道)。那么读出来时肯定要一个临时byte[]缓存。
所以我必须要定义byte[]缓存大小。
应该通过指定的编码格式,来达到控制最终的字节数目。
若使用GBK编码方式,最终的输出结果是10 20
使用其他编码方式(可能是自行指定,或者是当前环境的默认编码格式),
必须先要得知此编码方式的具体名称,
然后查看在该编码格式下,字符串与字节是如何转换的。
最终确定字符串被转换后,获取的字节数目。
public static Charset defaultCharset() {
if (defaultCharset == null) {
synchronized (Charset.class) {
java.security.PrivilegedAction pa =
new GetPropertyAction("file.encoding");
String csn = (String)AccessController.doPrivileged(pa);
Charset cs = lookup(csn);
if (cs != null)
defaultCharset = cs;
else
defaultCharset = forName("UTF-8");
}
}
return defaultCharset;
}如果你没有用什么设置,从命令行运行jvm,应该会用UTF-8编码,ASCII都是一个byte,所以长度是10。GBK跟UTF-8类似,ASCII也是一个byte。至于一个char等于两个byte,那是JVM内部表示String的时候统一用UTF16BE,而getBytes()实际上也是经过转换的。