byte[] b = new byte[100];
String str = "字符串测试";
System.arraycopy(str.getBytes(), 0, b, 0, str.getBytes().length);问题是:如果我获取到了类似b这么一个数组,我该怎样把里面的字符串取出来,而不要后面多余的空字节注:上面的代码只是模拟一下这个字节数组的内容,字符串的实际长度是未知的

解决方案 »

  1.   

    没太明白楼主的意思,如果是单纯的取一个字节数组中的字符串,这样不就行了吗
    String retStr = new String(b);
      

  2.   

    不要后面多余的空字节
    String retStr = new String(b);
    你打印一下这个字符串的长度看看,95, 并不是我想要的字符串长度为5的
      

  3.   

    有个笨办法,循环检查每个字节,遇到为0的,就停止 public static String trim(String str) {
    byte[] bs = str.getBytes();
    int p = 0;
    for (int i = 0; i < bs.length; i++) {
    if (bs[i] == 0) {
    p = i;
    break;
    }
    }
    byte[] b = new byte[p];
    System.arraycopy(bs, 0, b, 0, b.length);
    return new String(b);
    }不知道有没有效率高一点的办法
      

  4.   

    这个很简单啊, String在读取字符时, 以什么为终结符? 当然是以'\0'或者是EOF(文件终结符).所以在初始化byte[]的时候, 先默认都填写'\0'进去. 然后, 直接使用 new String(b)... 完事
      

  5.   

    先转成字符串,然后找到第一个空格出现的索引不就行了么?
    String str= new String(b);
    str.substring(str.indexOf(' '));
      

  6.   

    五楼的是不是应该改成:
    String str= new String(b);
    str.substring(int beginIndex,str.indexOf(' ')).
      

  7.   

    我只是跟你说说这个方法。
    空字节不是空格,它总是一个字符吧?总不会是什么都没有吧?如果是什么都没有的话,那你的length=95是哪来的?你找到它是什么字符不就完了么?
      

  8.   

    如果只是去掉多余的空格那简单了,只要str.trim()就行了
    关键这个问题是去掉多余的空字节,概念不要弄混了byte[] b = byte[100];
    这样默认的所有字节初始化为0,
    String str = "字符串测试"; 
    System.arraycopy(str.getBytes(), 0, b, 0, str.getBytes().length); 
    加了这句之后,只是填充了前面10个字节,后面的仍为0,new String(str)之后,后面的0字节并不是空格,这要弄清楚
      

  9.   

    是的,应该改成:
    str.substring(0,str.indexOf(' ')).
      

  10.   


    String retStr = new String(b); 
    String str1=retStr.trim();//直接去掉它后面的空格
    System.out.println(str1.length());呵呵。投机了一点
      

  11.   


    public class CSDN {    public static void main(String[] args) {
    byte[] b = new byte[100]; 
    String str = "字符串测试"; 
    System.arraycopy(str.getBytes(), 0, b, 0, str.getBytes().length); 
    String tmp = new String(b);
    System.out.println(tmp.substring(0,tmp.indexOf("\0")));    }
    }
      

  12.   

    上代码:
    public static void main(String[] args){
    String str = "字符串测试";
    byte[] bt1 = str.getBytes();
    System.out.println(bt1.length); // 这里打印15

    byte[] bt2 = new byte[100];
    for(int i = 0;i<15;i++){
    bt2[i] = bt1[i];
    }

    byte[] bt3 = {0,0,0};
    String sign = new String(bt3);//[0,0,0]这三个byte组成什么字符

    String rs = new String(bt2);
    rs = rs.substring(0, rs.indexOf(sign));//这是最后的结果

    System.out.println(rs.length());
    System.out.println(rs);
    }
      

  13.   

    bt2就是你得到的内容byte数组,除了前15位以外,后面都是初始值0。
    然后用三个0作为标志,去分割字符串:
    rs = rs.substring(0, rs.indexOf(sign));
      

  14.   


    这有什么难的呢。你要将那个十分重要的数据:
    System.arraycopy(str.getBytes(), 0, b, 0, str.getBytes().length);
    中的str.getBytes().length利用起来啊。因为:你都已拷贝过来了。楼主不要告诉我们说:System.arraycopy(...)也不知道,就知道一个byte[] b;里面放在东西,支找吧。这样子的话,没有其它信息,是无法解决问题的。
    还有其它什么信息可用?若真的就知道一个byte[] b;里面放在东西,支找吧。这样子的话,就只能从b的尾部向前找到第一个字节值不为0的,就认为是最后一个数据了。你总得要有一点信息让人利用来判别吧。
      

  15.   

    * 既然字符串长度是未知的,那就等到字符串之后再创建数组不就行了。
    * 这样就数组中就不会有多余的内容了String str = "字符串测试"; 
    byte[] b = new byte[str.getBytes().length]; 
    System.arraycopy(str.getBytes(), 0, b, 0, str.getBytes().length);
    String temp = new String(b);
    System.out.println(temp + ":");
      

  16.   

    // 计算byte[]的实际大小
    int getByteLength(byte[] res) {
    int len = 0;
    for (int pos = 0; pos < res.length; pos++) {
    if (res[pos] != 0) {
    len++;
    } else {
    break;
    }
    }
    return len;
    }