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

SZ深呼吸 2009-12-03 11:02:08
byte[] b = new byte[100];
String str = "字符串测试";
System.arraycopy(str.getBytes(), 0, b, 0, str.getBytes().length);

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

注:上面的代码只是模拟一下这个字节数组的内容,字符串的实际长度是未知的
...全文
423 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
x_todoo 2010-03-29
  • 打赏
  • 举报
回复
	// 计算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;
}
whut0802 2009-12-03
  • 打赏
  • 举报
回复
不好意思,发出的时候,上面的回复还没刷出来。。
误解了
whut0802 2009-12-03
  • 打赏
  • 举报
回复

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

呵呵。投机了一点
SZ深呼吸 2009-12-03
  • 打赏
  • 举报
回复
所以我说的那个笨方法就是,逐个判断字节是否为0
感觉这样目的是达到了,遇到大量字符串时,效率很低
bayougeng 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhanghuaigong 的回复:]
五楼的是不是应该改成:
String str= new String(b);
str.substring(int beginIndex,str.indexOf(' ')).
[/Quote]
是的,应该改成:
str.substring(0,str.indexOf(' ')).
SZ深呼吸 2009-12-03
  • 打赏
  • 举报
回复
如果只是去掉多余的空格那简单了,只要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字节并不是空格,这要弄清楚
bayougeng 2009-12-03
  • 打赏
  • 举报
回复
我只是跟你说说这个方法。
空字节不是空格,它总是一个字符吧?总不会是什么都没有吧?如果是什么都没有的话,那你的length=95是哪来的?你找到它是什么字符不就完了么?
zhanghuaigong 2009-12-03
  • 打赏
  • 举报
回复
如有不对,请多指教。
zhanghuaigong 2009-12-03
  • 打赏
  • 举报
回复
五楼的是不是应该改成:
String str= new String(b);
str.substring(int beginIndex,str.indexOf(' ')).
SZ深呼吸 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bayougeng 的回复:]
先转成字符串,然后找到第一个空格出现的索引不就行了么?
Java codeString str=new String(b);
str.substring(str.indexOf(''));
[/Quote]

空字节并不是空格,拜托先试过了再说话
SZ深呼吸 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zfangla 的回复:]
这个很简单啊, String在读取字符时, 以什么为终结符? 当然是以'\0'或者是EOF(文件终结符).

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

从服务器上得到的就是没有结束标志的,可能是服务器设计不好,但是不管怎样是不能改的了
全球车行网 2009-12-03
  • 打赏
  • 举报
回复

bayougeng 2009-12-03
  • 打赏
  • 举报
回复
先转成字符串,然后找到第一个空格出现的索引不就行了么?
String str= new String(b);
str.substring(str.indexOf(' '));
zfangla 2009-12-03
  • 打赏
  • 举报
回复
这个很简单啊, String在读取字符时, 以什么为终结符? 当然是以'\0'或者是EOF(文件终结符).

所以在初始化byte[]的时候, 先默认都填写'\0'进去. 然后, 直接使用 new String(b)... 完事
SZ深呼吸 2009-12-03
  • 打赏
  • 举报
回复
有个笨办法,循环检查每个字节,遇到为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);
}


不知道有没有效率高一点的办法
SZ深呼吸 2009-12-03
  • 打赏
  • 举报
回复
不要后面多余的空字节
String retStr = new String(b);
你打印一下这个字符串的长度看看,95, 并不是我想要的字符串长度为5的
anly_hz 2009-12-03
  • 打赏
  • 举报
回复
没太明白楼主的意思,如果是单纯的取一个字节数组中的字符串,这样不就行了吗
String retStr = new String(b);
wuhaozhiyuan 2009-12-03
  • 打赏
  • 举报
回复
* 既然字符串长度是未知的,那就等到字符串之后再创建数组不就行了。
* 这样就数组中就不会有多余的内容了

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

云上飞翔 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 baiydn 的回复:]
byte[] b = new byte[100];
String str = "字符串测试";
System.arraycopy(str.getBytes(), 0, b, 0, str.getBytes().length);

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

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

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

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

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧