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

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

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

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

不知道各位大侠,有什么更好的办法?
...全文
1600 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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
lcllcl987 2007-01-11
  • 打赏
  • 举报
回复
正则表达式估计比substring要好
AHUA1001 2007-01-11
  • 打赏
  • 举报
回复
up
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);
}

}
加载更多回复(14)

81,091

社区成员

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

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