高分求一个关于循环取内容的问题!
从服务器返回一个大字符串,例如:String str = "00000008abcdabcd00000012aabbccddeeff00000007aabbccd00000001a00000003aaa ";
从一开始第一个到第8个,00000008,表示后面跟着的字段有8位,取出来abcdabcd,然后再继续,取8个,是00000012,表示后面跟着的字段有12位,取出来为 aabbccddeeff,以此类推
小弟用的最笨的办法,substring,从第一个取到第8个,然后再根据里面的数字,再排着从第9位,取出 8个,得到 abcdabcd
不知道各位大侠,有什么更好的办法?
[解决办法]
你要能保证字符中的数据不能有8位连续的数字
<%
String s= "00000008abcdabcd00000012aabbccddeeff00000007aabbccd00000001a00000003aaa ";
String ss[] =s.split( "[0-9]{8} ");
for(int i=0;i <ss.length;i++)
{
out.println(ss[i]+ " <br> ");
}
%>
[解决办法]
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);
}
}
[解决办法]
<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>
[解决办法]
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的字符按顺序存入数组
}
}
每行是要的一组数。
[解决办法]
太简单了吧..
<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>
[解决办法]
楼主第二个原始数据是错误地..第一个是正确地...用递归弄了个...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);