前几天在论坛上问了个问题,跟贴得不少,没有一个人回答问题,我宁愿相信,是他们没弄懂需求。这年头搞技术的人,都有点酸酸的味道,又不是专利,为什么不能多点共享精神呢?
需求如下
做一个信号处理的东西。信号格式如下
信号 信号名{
0000120"string" # comment
002D0"string" # comment
006e0"string" # comment
}
转换规则:去掉信号,去掉信号名,去掉注释(#到换行)," "(字符串)内字符串转换为16进制,
经过转换,信号变为"0100000000000000001076000000C6868696E00"类似的格式。
现在要实现一个功能,给出转换后的位置(比如第2位),如何查找转换前(原信号)的位置。
问题地址如下
http://topic.csdn.net/u/20071128/16/6d5bb2e1-83de-4f20-a60d-e99f9c9c87b2.html
代码如下:
/**
* get length before data<br>
*
* @param String
* data
* @return length
* @throws N/A
* @author tianrenliang
* @since V0.1(2007/11/28)
*/
private int getLengthBeforeData(String strdata) {
int iLengthBeforeData = 0;
int ibeforeStartTagLength = 0;
String strsubString = null;
if (strdata.indexOf(strStartTag) != -1) {
strsubString =
strdata.substring(0, strdata.indexOf(strLineSeparator));
}
ibeforeStartTagLength = strsubString.length();
int iseparatorLength = strLineSeparator.length();
// length is before line separator and separator length
iLengthBeforeData = ibeforeStartTagLength + iseparatorLength;
return iLengthBeforeData;
}
/**
* get rid of start tag and end tag <br>
* @param avp data
* @return content
* @throws N/A
* @author tianrenliang
* @since V0.1(2007/11/28)
*/
private String getContent(String strContent)
{
int iLengthBeforeData = getLengthBeforeData(strDecodeData);
String content = null;
if(null == strContent )
{
return null;
}
//get the string between line change tag
if(strContent.indexOf(strStartTag)!=-1&&
strContent.indexOf(strEndTag)!=-1)
{
content = strContent.substring(
iLengthBeforeData,
strContent.indexOf(strEndTag));
content = content.replace(strStartTag, "");
}
else
{
return null;
}
return content;
}
/**
* convert a string to hex string <br>
* @param String data
* @return hexString
* @throws N/A
* @author tianrenliang
* @since V0.1(2007/11/28)
*/
private String stringToHexString(String strPart) {
String hexString = "";
for (int i = 0; i < strPart.length(); i++) {
int ch = (int) strPart.charAt(i);
String strHex = Integer.toHexString(ch);
hexString = hexString + strHex;
}
return hexString;
}
/**
* get the error position in file <br>
* @param int iErrorPosition
* @return iPosition
* @throws N/A
* @author tianrenliang
* @since V0.1(2007/11/28)
*/
public int getErrorPosition(int iErrorPosition){
String strDecodeData = getDecodeDataInfo();
String strData = getNullFormatData(strDecodeData);
int iDataErrorPosition = setErrorPosition(iErrorPosition);
String strContent = getContent(strDecodeData);
int iLengthBeforeData = getLengthBeforeData(strDecodeData);
int iPosition = 0;
int iOtherLength = 0;
int iStringLength = 0;
String strDataBeforeErrorPosition =
strData.substring(0,iDataErrorPosition);
int i = 0;
int iStringPosition = 0;
int iInString =0;
while(i<strDataBeforeErrorPosition.length())
{
//if ErrorData in this position equals to content in this position
if(strDataBeforeErrorPosition.charAt(i)
==strContent.charAt(i+iOtherLength))
{
i++;
}
//count the length of space part
else if(strContent.charAt(i+iOtherLength)==chSpaceTag)
{
iOtherLength++;
}
//count the length of comment part
else if(strContent.charAt(i+iOtherLength)==chrCommentTag)
{
while(strContent.charAt(i+iOtherLength)!=' ')
{
iOtherLength ++;
}
iOtherLength ++;
}
//count the length of string part
else if(strContent.charAt(i+iOtherLength)==stringTag)
{
iInString = i;
int iLength = 0;
int iStartPosition = 0;
int iEndPosition = 0;
iOtherLength++;
iStartPosition = iInString+iOtherLength;
//get the length of string
while(strContent.charAt(iInString+iOtherLength+iLength)!=
stringTag)
{
iLength++;
}
iEndPosition = iStartPosition+iLength;
String string = strContent.substring(iStartPosition,
iEndPosition);
string = stringToHexString(string);//convert this part to hex
iLength = string.length();
//compare hex string part with strDataBeforeErrorPosition
while(iStringPosition<string.length()
&&iInString<strDataBeforeErrorPosition.length())
{
if(string.charAt(iStringPosition)==
strDataBeforeErrorPosition.charAt(iInString))
{
iInString++;
iStringPosition++;//if equal,compare next position
iLength--;
}
else
{
iInString++;//else compare string's next position
}
}
iStringLength = iStringPosition/2;//convert length to byte
if(iLength>0)//if end position in string
{
iOtherLength = iOtherLength-iStringPosition+iStringLength;
}
else//if end position not in string ,need to add'"' length 1
{
iOtherLength = iOtherLength-iStringPosition+iStringLength+1;
}
i = i+iStringPosition;
}
}
//because index is from 0,so position need to minus 1 from length.
iPosition =i+iOtherLength+iLengthBeforeData;
return iPosition;
}
唯一的问题是,写了个大函数,远远超过50行。有空的时候把它拆了。