黑马程序员技术交流社区

标题: 关于字节读取的问题 [打印本页]

作者: 罗胜华    时间: 2013-3-27 12:18
标题: 关于字节读取的问题

public class Test {
/**
  *
  */
public static void main(String[] args) {
      String s = "abc中国";
      //这时候abc中国是7个字节,如果我想读取6个字节,怎么保证它的完整度
      
      byte[] bytes = s.getBytes();
      
      getString(bytes,6);
}
public static String getString(byte[] b,int len) {
  int count = 0;
  String s =null;
  //汉字在内存中是负数的形式,所以找出负数的个数
  for(int i = 0; i<b.length; i++) {
       if(b[i]<0){
        count ++;
       }
     }
  if(count%2==0) {
   s = new String(b,0,len);
  }else{
   len--;
  }
  return s;
}
}
为什么结果得不到正确的答案?

作者: 张豪杰    时间: 2013-3-27 12:34
if(count%2==0) {
   s = new String(b,0,len);
  }else{
   len--;
  }
抽取你代码中有问题的一部分
你上面那段代码是说,如果没有半个汉字存在,即count%2==0为true时,执行 s = new String(b,0,len);这里没错,这样判断很巧妙
但是你的else那部分代码,如果存在半个汉字,len自减,自减后呢?是不是应该生成个字符串啊?你就让编译器把截取长度减1,没有让编译器照这个长度去重新截取一个字符串-。-这能正确的话,只能说jvm太智能了
else部分的代码加改成下面那样试试?
else{
   len--;
   s = new String(b,0,len);
  }

或许这样可以-。-我没运行过
作者: 黑马潘浩    时间: 2013-3-27 12:36
首先不知道你预想的答案是什么?然后你整个程序没有一个打印语句怎么看到的结果?最后我在打印了一下 System.out.println(getString(bytes,6));,打印结果为:abc中?。。我觉得的这个结果也是对的,因为中国的国字由两个字节组成,你只获取了一个字节就打印了,也应该是个?符号。
作者: VOIDMAIN    时间: 2013-3-29 22:43
此题最关键就是判断是不是汉字,如果是汉字的话,就在截取的时候增加或者减少一个字节(根据题目要求,保全汉字),汉字有一个正则表达式,在API中可以查,

按你这种思路,即先获取汉字的字节,也是可以的,但是你要注意,一个汉字是以两个负数来表示的。只要这些原则了,我想还是能搞定的了,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2