高分求一个关于循环取内容的问题!

倪大爺爺 2007-01-10 11:19:33
从服务器返回一个大字符串,例如:String str = "00000008abcdabcd00000012aabbccddeeff00000007aabbccd00000001a00000003aaa";

从一开始第一个到第8个,00000008,表示后面跟着的字段有8位,取出来abcdabcd,然后再继续,取8个,是00000012,表示后面跟着的字段有12位,取出来为 aabbccddeeff,以此类推

小弟用的最笨的办法,substring,从第一个取到第8个,然后再根据里面的数字,再排着从第9位,取出 8个,得到 abcdabcd

不知道各位大侠,有什么更好的办法?
...全文
1550 点赞 收藏 34
写回复
34 条回复
bingbingcha 2007年01月12日
楼主第二个原始数据是错误地..第一个是正确地...用递归弄了个...C#版...
不管中间是否有什么数据...都可以正确读取..因为已经知道了第一个起始数据是8位.取得这个数据,得到第二个数据块的长度和位置...依次递归下去..一直到取完结果为止...

private static void a(int start){

string s = "00000008abcdabcd00000012aabbccddeeff00000007aabbccd00000001a00000003aaa";
if ( start == s.Length )
return ;
int len = Convert.ToInt32( s.Substring(start,8) );
string item = s.Substring( start+8,len );
int nextPos = start + item.Length + 8;
Console.WriteLine( item + "("+ item.Length +")\t" + len );

a( nextPos );
}

调用的时候:
a(0);

回复 点赞
zerohk 2007年01月11日
.
回复 点赞
yifuzhiming 2007年01月11日
学习
回复 点赞
lvf20 2007年01月11日


String array[][]=new String[str.length/8][8];
int i=0;
int j=0;

for(i=0;i<str/8;i++){
for(j=0;j<8;j++){
array[i][j]=将str的字符按顺序存入数组
}
}

每行是要的一组数。
回复 点赞
geleisi 2007年01月11日
mark
回复 点赞
AHUA1001 2007年01月11日
up
回复 点赞
lcllcl987 2007年01月11日
正则表达式估计比substring要好
回复 点赞
DotQuery 2007年01月11日
太简单了吧..

<html>
<table>
<tr>
<td>数组(一行一条字符串)</td>
<td>数据8位字符当长度</td>
</tr>
<tr>
<td><textarea rows=8 cols=64 id=taArray>
sadkfjasdf
asdfas
dfasdfas
</textarea></td>
<td><textarea rows=8 cols=64 id=taData></textarea></td>
</tr>
<tr>
<td align=right><button onclick="ToData()">把数组转换成数据 -->--> </button></td>
<td><button onclick="ToArray()"> <--<-- 把数据还原成数组</button></td>
</tr>
</table>


<script>

function ToSize(len)
{
len=len.toString();
while(len.length<8)
len="0"+len;
return len;
}
function ParseSize(str)
{
return parseInt(str,10);
}

function ToData()
{
var arr=taArray.value.split("\r\n");
var sb=[];
for(var i=0;i<arr.length;i++)
{
var str=arr[i];
sb.push(ToSize(str.length));
sb.push(str);
}
taData.value=sb.join("");
}
function ToArray()
{
var str=taData.value;
var arr=[];
var index=0;
while(index<str.length)
{
var len=ParseSize(str.substr(index,8));
index+=8;
arr.push(str.substr(index,len));
index+=len;
}
taArray.value=arr.join("\r\n");
}
</script>
</html>
回复 点赞
wuxinlangman 2007年01月11日
<SCRIPT LANGUAGE="JavaScript">
<!--
var str = "00000036http://www.sina.com/80/36/75/aaa.htm00000000000000064520MB00000022反反复复反反复复凤飞飞000000162006-01-10 18:4700000036http://www.sohu.com/80/36/75/aaa.htm00000000000000064520MB00000022sg0318@BTPIG&BTGOD";
//求出所有的数字的正则
var reg=/[0]\d{7}/g;
//求出所有非0的正则
var reg1=/[^0]/g;
//得到字符串中数字的数组
7楼的方法可以不过我给换了一下正则!

var newArray=str.split(reg);//match(reg);
alert(newArray);
//-->
</SCRIPT>
回复 点赞
Maxwell 2007年01月11日
如果字符串中可能出现8个以上的连续数字那就必须从字符串的开始读,用循环是唯一的办法了。
回复 点赞
macnab 2007年01月11日
行压缩算法,


采用分段读取.最方便,
回复 点赞
CnEve 2007年01月11日
study
回复 点赞
DotNetGoodSky 2007年01月11日
考虑使用正则表达式!mnds有丰富的内容!
回复 点赞
shengwenjie 2007年01月11日
倒,我要好好学习下了
回复 点赞
倪大爺爺 2007年01月10日
一个上午都没人回复啊?
回复 点赞
wuxinlangman 2007年01月10日
<SCRIPT LANGUAGE="JavaScript">
<!--
var str="00000008abcdabcd00000012aabbccddeeff00000007aabbccd00000001a00000003aaa";
//求出所有的数字的正则
var reg=/\d+/g;
//求出所有非0的正则
var reg1=/[^0]/g;
//得到字符串中数字的数组
var newArray=str.match(reg);
//设定字符串的参数
var wuxin="";
//设定当前游标的位置
var curLentght=0;
//把刚才求出的数组循环分别得到里面的字符串
for(var i=0;i<newArray.length;i++){
//求出截取字符串的开始为知当前游标的位置curLentght+数组中的项目的长度为开始位置
var start=curLentght+newArray[i].length;
//得到项目中不是0的数它返回的是个数组
var newString=newArray[i].match(reg1);
//把数组转化成字符串然后替换掉","就能组成代表个数的数字;
var pos=newString.toString().replace(",","");
//这里把上面的字符串转化成Int类型
var num=parseInt(pos);
//截取字符串的结束位置当前游标curLentght+项目的长度+我们要截取的长度
var end =parseInt(curLentght)+newArray[i].length+num;
//截取字符串
wuxin =str.substring(start,end)
//输出字符串
alert("当前的字符串的个数是:"+num+"个,字符串是:"+wuxin)
//然后让当前的游标位置等于我们截取后的位置
curLentght =end;
//循环截取
}
//-->
</SCRIPT>
回复 点赞
isly_baby 2007年01月10日
用数组返回更容易
回复 点赞
emin_lee 2007年01月10日
String s = "00000036http://www.sina.com/80/36/75/aaa.htm000000064520MB00000022反反复复反反复复凤飞飞000000162006-01-10 18:4700000036http://www.sohu.com/80/36/75/aaa.htm000000064520MB00000022sg0318@BTPIG&BTGOD";

---------------------------
楼主给的原始数据有问题,应该是上述测试数据。
回复 点赞
emin_lee 2007年01月10日
楼主测试一下:)
回复 点赞
emin_lee 2007年01月10日
import java.util.Vector;

public class TestStringSub {

public static final int DATA_SIZE_LENGTH = 8;

public TestStringSub() {

super();
}

public String getData(byte[] allData, int offset, int length) {

return new String(allData, offset, length);
}

public int getDataLength(byte[] allData, int offset) {

return Integer.parseInt(getData(allData, offset, DATA_SIZE_LENGTH));
}

public Vector getData(byte[] allData) {

Vector data = new Vector();
int offset = 0;
String one = "";
int dataLength = 0;
while (offset != allData.length) {
dataLength = getDataLength(allData, offset);
offset = offset + DATA_SIZE_LENGTH;
one = getData(allData, offset, dataLength);
data.add(one);
offset = offset + dataLength;
}

return data;
}

/**
* @param args
*/
public static void main(String[] args) {

TestStringSub test = new TestStringSub();
String s = "00000036http://www.sina.com/80/36/75/aaa.htm000000064520MB00000022反反复复反反复复凤飞飞000000162006-01-10 18:4700000036http://www.sohu.com/80/36/75/aaa.htm00000000000000064520MB00000022sg0318@BTPIG&BTGOD";
byte[] allData = s.getBytes();
Vector data = test.getData(allData);
}

}
回复 点赞
发动态
发帖子
Web 开发
创建于2007-09-28

5.2w+

社区成员

34.1w+

社区内容

Java Web 开发
社区公告
暂无公告