关于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;
}
...全文
106 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
久爱物联网 2014-08-05
  • 打赏
  • 举报
回复
public static void SetByte(Array array,int index,byte value) //http://technet.microsoft.com/zh-cn/magazine/system.buffer.setbyte(VS.95).aspx Array.Clear(numbers1, 0, 50); //http://msdn.microsoft.com/zh-cn/library/system.array.clear.aspx 没搞明白 parseSms 怎么调用。
久爱物联网 2014-08-05
  • 打赏
  • 举报
回复
建议能重新利用C#写一个。 测试字符串传递的参数为 |1#04#10086#短信内容abcd|2#04#10086#短信|内容|3#04#10086#短信#内容|4#04#18000000000#短信内|容 写个函数返回即可,仅把短信内容中的|换成汉字的竖线│或§,#换成汉字的井号# 返回即可,或返回给一个数组也行; 比如返回结果为 |1#04#10086#短信内容abcd|2#04#10086#短信§内容|3#04#10086#短信#内容|4#04#18000000000#短信内§容 即可。
gomoku 2014-08-05
  • 打赏
  • 举报
回复
memset(sms_.id,0,50); 就是清零50个单位,你自己用循环做就可以了。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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