在字节数组中取字符串的问题

时间:2021-11-29 10:53:50
byte[] b = new byte[100];
String str = "字符串测试";
System.arraycopy(str.getBytes(), 0, b, 0, str.getBytes().length);

问题是:如果我获取到了类似b这么一个数组,我该怎样把里面的字符串取出来,而不要后面多余的空字节

注:上面的代码只是模拟一下这个字节数组的内容,字符串的实际长度是未知的

23 个解决方案

#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



#7


引用 4 楼 zfangla 的回复:
这个很简单啊, String在读取字符时, 以什么为终结符? 当然是以'\0'或者是EOF(文件终结符).

所以在初始化byte[]的时候, 先默认都填写'\0'进去. 然后, 直接使用 new String(b)... 完事


从服务器上得到的就是没有结束标志的,可能是服务器设计不好,但是不管怎样是不能改的了

#8


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


空字节并不是空格,拜托先试过了再说话

#9


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

#10


如有不对,请多指教。

#11


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

#12


如果只是去掉多余的空格那简单了,只要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字节并不是空格,这要弄清楚

#13


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

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

#14


所以我说的那个笨方法就是,逐个判断字节是否为0
感觉这样目的是达到了,遇到大量字符串时,效率很低

#15



String retStr = new String(b); 
String str1=retStr.trim();//直接去掉它后面的空格
System.out.println(str1.length());

呵呵。投机了一点

#16


不好意思,发出的时候,上面的回复还没刷出来。。
误解了

#17



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")));

    }
}

#18


上代码:
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);
}

#19


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

#20


顶一个!

#21


引用楼主 baiydn 的回复:
byte[] b = new byte[100];
String str = "字符串测试";
System.arraycopy(str.getBytes(), 0, b, 0, str.getBytes().length);

问题是:如果我获取到了类似b这么一个数组,我该怎样把里面的字符串取出来,而不要后面多余的空字节

注:上面的代码只是模拟一下这个字节数组的内容,字符串的实际长度是未知的


这有什么难的呢。你要将那个十分重要的数据:
System.arraycopy(str.getBytes(), 0, b, 0,  str.getBytes().length);
中的str.getBytes().length利用起来啊。因为:你都已拷贝过来了。

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

#22


* 既然字符串长度是未知的,那就等到字符串之后再创建数组不就行了。
* 这样就数组中就不会有多余的内容了

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 + ":");

#23


	// 计算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;
}

#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



#7


引用 4 楼 zfangla 的回复:
这个很简单啊, String在读取字符时, 以什么为终结符? 当然是以'\0'或者是EOF(文件终结符).

所以在初始化byte[]的时候, 先默认都填写'\0'进去. 然后, 直接使用 new String(b)... 完事


从服务器上得到的就是没有结束标志的,可能是服务器设计不好,但是不管怎样是不能改的了

#8


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


空字节并不是空格,拜托先试过了再说话

#9


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

#10


如有不对,请多指教。

#11


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

#12


如果只是去掉多余的空格那简单了,只要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字节并不是空格,这要弄清楚

#13


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

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

#14


所以我说的那个笨方法就是,逐个判断字节是否为0
感觉这样目的是达到了,遇到大量字符串时,效率很低

#15



String retStr = new String(b); 
String str1=retStr.trim();//直接去掉它后面的空格
System.out.println(str1.length());

呵呵。投机了一点

#16


不好意思,发出的时候,上面的回复还没刷出来。。
误解了

#17



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")));

    }
}

#18


上代码:
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);
}

#19


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

#20


顶一个!

#21


引用楼主 baiydn 的回复:
byte[] b = new byte[100];
String str = "字符串测试";
System.arraycopy(str.getBytes(), 0, b, 0, str.getBytes().length);

问题是:如果我获取到了类似b这么一个数组,我该怎样把里面的字符串取出来,而不要后面多余的空字节

注:上面的代码只是模拟一下这个字节数组的内容,字符串的实际长度是未知的


这有什么难的呢。你要将那个十分重要的数据:
System.arraycopy(str.getBytes(), 0, b, 0,  str.getBytes().length);
中的str.getBytes().length利用起来啊。因为:你都已拷贝过来了。

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

#22


* 既然字符串长度是未知的,那就等到字符串之后再创建数组不就行了。
* 这样就数组中就不会有多余的内容了

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 + ":");

#23


	// 计算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;
}