关于C++代码转C#遇到的问题,请高手指点!谢谢
久爱物联网 企业官方账号 2014-08-05 05:04:21 这个问题源自要解决一个字符串分割的问题。
偶尔一个机会发现别人写的一段代码可以解决此问题,但我无法转为C#代码。请高手指点!!谢谢!
代码来自:http://blog.csdn.net/zeeeitch/article/details/7663437
(二次开发一个短信猫程序,由于dll已封装好的,分隔符无法换成其他的。所有遇到短信内容里有分隔符|或#时造成解析崩溃)
我想把此解决问题的思路变成C#的。
我用工具C++ to Sharp Converter转换了一下,遇到
//C++ TO C# CONVERTER TODO TASK: The memory management function 'memset' has no equivalent in C#:
memset(sms_.time,0,50);
请大侠有更好的方法解决此问题或完美转换上面的代码也行。
工具转换后的代码如下:
public static class GlobalMembers
{
public static void parseSms(string contentAll, ref List<Sms> sms)
{
if (contentAll ==0)
return;
int i =0; //遍历contentall用,
int status =0; //0 没开始or 找到时间,1 找到| , 2 找到类型 3 找到手机 ,4找到内容
//|1#04#8613970234430#123#11-07-12 10:00:17
//1 短信索引号
//04 短信类型
//8613970234430 手机号码
//123 回复内容
//时间
Sms sms_ = new Sms();
while(1)
{
switch(status)
{
case 0:
while (contentAll[i]!='\0'&&contentAll[i]!='|')
i++;
if(contentAll[i]=='|')
{
status =1;
string b ={0};
int j =0;
i++;
while (contentAll[i]!='\0'&&contentAll[i]!='#')
{
if(j>10||contentAll[i]<'0' ||contentAll[i]>'9') //id分析出错,回到status 0
{
status =0;
break;
}
b[j++]=contentAll[i++];
}
if(contentAll[i]=='\0')
return;
//C++ TO C# CONVERTER TODO TASK: The memory management function 'memset' has no equivalent in C#:
memset(sms_.id,0,50);
sms_.id = b;
}
else
return;
break;
case 1:
if(contentAll[i]=='#')
{
status =2;
string b ={0};
int j =0;
i++;
while (contentAll[i]!='\0'&&contentAll[i]!='#')
{
if(j>10) //type分析出错,回到status 0
{
status =0;
break;
}
b[j++]=contentAll[i++];
}
if(contentAll[i]=='\0')
return;
//C++ TO C# CONVERTER TODO TASK: The memory management function 'memset' has no equivalent in C#:
memset(sms_.type,0,50);
sms_.type = b;
if(status ==0) //出错不能丢弃,放在vector,出去后需要对id调用,删除sim卡中短信
{
sms_.parseOk =false;
sms.Add(sms_);
}
}
break;
case 2:
if(contentAll[i]=='#')
{
status =3;
string b ={0};
int j =0;
i++;
while (contentAll[i]!='\0'&&contentAll[i]!='#')
{
if(j>30) //mobile分析出错,回到status 0
{
status =0;
break;
}
b[j++]=contentAll[i++];
}
if(contentAll[i]=='\0')
return;
//C++ TO C# CONVERTER TODO TASK: The memory management function 'memset' has no equivalent in C#:
memset(sms_.mobile,0,50);
sms_.mobile = b;
if(status ==0)
{
sms_.parseOk =false;
sms.Add(sms_);
}
}
break;
case 3: //找内容,要考虑用户输入了| 和 #
if(contentAll[i]=='#')
{
i++;
//找到下一个|或结尾
int endForThisMsg =0;
int i_ =i;
bool foundJinghao =false; //发现警号,必须发现#再发现|,只发现|,跳过
while (contentAll[i_]!='\0'&&(contentAll[i_]!='|'||!foundJinghao))
if(contentAll[i_++]=='#')
foundJinghao =true;
endForThisMsg = i_;
//找到本节最后一个#
i_ =endForThisMsg;
while(contentAll[i_--]!='#')
;
endForThisMsg = i_;
if(endForThisMsg - i +1>=0&&endForThisMsg - i +1<200) //缓冲区200,分析出超过200 的短信认为出错,抛弃,进入下一条
{
//C++ TO C# CONVERTER TODO TASK: The memory management function 'memset' has no equivalent in C#:
memset(sms_.content,0,200);
//C++ TO C# CONVERTER TODO TASK: The memory management function 'memcpy' has no equivalent in C#:
memcpy(sms_.content,contentAll+i,endForThisMsg - i +1);
status =4;
i =endForThisMsg+1;
}
else
{
sms_.parseOk =false;
sms.Add(sms_);
status =0;
}
}
break;
case 4:
if(contentAll[i]=='#')
{
status =0;
string b ={0};
int j =0;
i++;
bool breakF =false;
while (contentAll[i]!='\0'&&contentAll[i]!='|')
{
if(j>=49) //时间分析出错,回到status 0
{
status =0;
breakF =true;
break;
}
b[j++]=contentAll[i++];
}
if(breakF)
{
sms_.parseOk =false;
sms.Add(sms_);
break;
}
if(j<14) //时间没找到,可能是用户有输入#| , 回到status 0
{
sms_.parseOk =false;
sms.Add(sms_);
break;
}
//C++ TO C# CONVERTER TODO TASK: The memory management function 'memset' has no equivalent in C#:
memset(sms_.time,0,50);
sms_.time = b;
//插入vector返回值
sms_.parseOk =true;
sms.Add(sms_);
}
break;
}
}
}
}
public class Sms
{
public string id = new string(new char[50]);
public string type = new string(new char[50]);
public string mobile = new string(new char[50]);
public string content = new string(new char[200]);
public string time = new string(new char[50]);
public bool parseOk;
}