请教:VC#2005代码转VC++ 6.0,逻辑并不复杂

纯冰糖 2008-12-15 09:06:52

//打包
public byte[] SetupPack(char Type)
{
CCheck check=new CCheck();
byte[] RStr,PHead=new byte[100],PBody,PTrail;
byte[] rSendPack=new byte[200];
byte[] Temp=new byte[200],sendtemp;
byte tempaddsum=0,tempxorsum=0;
// rSendPack.SetValue(0);

if (Type == 'A')
{
//包头
//int rand = GetSequenNumber();//包序列号

if (SetFlag == 1)//静态包
{
//包体
rSendPack[0] = 0xff;//包头
rSendPack[1] = 0x30;
rSendPack[2] = 43;//长度
rSendPack[3] = 0x02;//命令字
rSendPack[4] = 0x01;//设置标志1为静态,2为动态
//clientip
rSendPack[5] = Convert.ToByte(myset.ClientIP1.Text);
rSendPack[6] = Convert.ToByte(myset.ClientIP2.Text);
rSendPack[7] = Convert.ToByte(myset.ClientIP3.Text);
rSendPack[8] = Convert.ToByte(myset.ClientIP4.Text);
//子网掩码
rSendPack[9] = Convert.ToByte(myset.SubNetText1.Text);
rSendPack[10] = Convert.ToByte(myset.SubNetText2.Text);
rSendPack[11] = Convert.ToByte(myset.SubNetText3.Text);
rSendPack[12] = Convert.ToByte(myset.SubNetText4.Text);
//网关
rSendPack[13] = Convert.ToByte(myset.GatwayText1.Text);
rSendPack[14] = Convert.ToByte(myset.GatwayText2.Text);
rSendPack[15] = Convert.ToByte(myset.GatwayText3.Text);
rSendPack[16] = Convert.ToByte(myset.GatwayText4.Text);
//Mac地址
//char[] ch=myset.MACAdderText1.Text.ToCharArray();
//byte[] by=Encoding.ASCII.GetBytes(ch);
rSendPack[17] = Convert.ToByte(myset.MACAdderText1.Text.Trim(),16);
rSendPack[18] = Convert.ToByte(myset.MACAdderText2.Text.Trim(), 16);
rSendPack[19] = Convert.ToByte(myset.MACAdderText3.Text.Trim(), 16);
rSendPack[20] = Convert.ToByte(myset.MACAdderText4.Text.Trim(), 16);
rSendPack[21] = Convert.ToByte(myset.MACAdderText5.Text.Trim(), 16);
rSendPack[22] = Convert.ToByte(myset.MACAdderText6.Text.Trim(), 16);
//新网桥ID号
long lid = Convert.ToInt64(myset.IDtextBox.Text);
rSendPack[23] = Convert.ToByte(lid/256);
rSendPack[24] = Convert.ToByte(lid%256);
//服务器IP地址
rSendPack[25] = Convert.ToByte(myset.ServerIPtext1.Text);
rSendPack[26] = Convert.ToByte(myset.ServerIPtext2.Text);
rSendPack[27] = Convert.ToByte(myset.ServerIPtext3.Text);
rSendPack[28] = Convert.ToByte(myset.ServerIPtext4.Text);

//服务器端口号
lid = Convert.ToInt64(myset.PortText.Text);
rSendPack[29]=Convert.ToByte(lid/256);
rSendPack[30] = Convert.ToByte(lid%256);
//旧网桥ID号
lid = Convert.ToInt32(listView1.SelectedItems[0].SubItems[2].Text);
rSendPack[31] = Convert.ToByte(lid / 256);
rSendPack[32] = Convert.ToByte(lid % 256);

//终端名称10bytes
char[] chTemp = myset.TermNametextBox.Text.ToCharArray();
// byte[] bTemp
byte[] bTemp = Encoding.Default.GetBytes(chTemp, 0, chTemp.Length);
Buffer.BlockCopy(bTemp, 0, rSendPack, 33, bTemp.Length);

//包尾

rSendPack.CopyTo(Temp,0);
check.AddSum(Temp, 43, ref tempaddsum);
check.XorSum(Temp, 43, ref tempxorsum);
rSendPack[43] = tempaddsum;
rSendPack[44] = tempxorsum;



}//if (SetFlag == 1)

//动态设置打包begin
else if(SetFlag ==0)
{

rSendPack.Initialize();
rSendPack[0] = 0xff;//包头
rSendPack[1] = 0x30;
rSendPack[2] = 43;//长度
rSendPack[3] = 0x02;//命令字
rSendPack[4] = 0x02;//设置标志1为静态,2为动态

//Mac地址
//char[] ch=myset.MACAdderText1.Text.ToCharArray();
//byte[] by=Encoding.ASCII.GetBytes(ch);
rSendPack[17] = Convert.ToByte(myset.MACAdderText1.Text.Trim(), 16);
rSendPack[18] = Convert.ToByte(myset.MACAdderText2.Text.Trim(), 16);
rSendPack[19] = Convert.ToByte(myset.MACAdderText3.Text.Trim(), 16);
rSendPack[20] = Convert.ToByte(myset.MACAdderText4.Text.Trim(), 16);
rSendPack[21] = Convert.ToByte(myset.MACAdderText5.Text.Trim(), 16);
rSendPack[22] = Convert.ToByte(myset.MACAdderText6.Text.Trim(), 16);


//新id号
long tempid = Convert.ToInt64(myset.IDtextBox.Text);
rSendPack[23] = Convert.ToByte(tempid / 256);
rSendPack[24] = Convert.ToByte(tempid%256);

//服务器IP地址
rSendPack[25] = Convert.ToByte(myset.ServerIPtext1.Text);
rSendPack[26] = Convert.ToByte(myset.ServerIPtext2.Text);
rSendPack[27] = Convert.ToByte(myset.ServerIPtext3.Text);
rSendPack[28] = Convert.ToByte(myset.ServerIPtext4.Text);

//服务器端口号
long port = Convert.ToInt64(myset.PortText.Text);
rSendPack[29] = Convert.ToByte(port / 256);
rSendPack[30] = Convert.ToByte(port % 256);
//旧网桥ID号
int lid = Convert.ToInt32(listView1.SelectedItems[0].SubItems[2].Text);
rSendPack[31] = Convert.ToByte(lid / 256);
rSendPack[32] = Convert.ToByte(lid % 256);

//终端名称10bytes
char[] chTemp = myset.TermNametextBox.Text.ToCharArray();
// byte[] bTemp
byte[] bTemp = Encoding.Default.GetBytes(chTemp, 0, chTemp.Length);
Buffer.BlockCopy(bTemp, 0, rSendPack, 33, bTemp.Length);



rSendPack.CopyTo(Temp, 0);
check.AddSum(Temp, 43, ref tempaddsum);
check.XorSum(Temp, 43, ref tempxorsum);
rSendPack[43] = tempaddsum;
rSendPack[44] = tempxorsum;

}//动态设置打包end


}//if (Type == 'A')

if (Type == 'S')//打搜索包
{
//char[] cSetuppack = new char[] {'\0xff','\0x30','\x4','\0x01' };
//char[] myChars = new char[] { 'z', 'a', '\u0306', '\u01FD', '\u03B2', '\uD8FF', '\uDCFF' };

rSendPack[0] = 0xff;//包头
rSendPack[1] = 0x30;
rSendPack[2] = 4;//长度
rSendPack[3] = 0x01;//命令字
Temp = rSendPack;
check.AddSum(Temp, 4, ref tempaddsum);
check.XorSum(Temp, 4, ref tempxorsum);
rSendPack[4] = tempaddsum;
rSendPack[5] = tempxorsum;


}//if (Type == 'S')

return rSendPack;
}

...全文
139 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
maliang1225 2009-01-21
  • 打赏
  • 举报
回复
"BYTE[] SetupPack(char Type);函数就出错,不知道VC的BYTE和C#的byte[]怎么转换啊"

==> C++需要用指针,返回数组的首地址即可。

BYTE* SetupPack(char Type)
{
BYTE RStr,PBody,PTrail;
BYTE PHead[100] = {0};

BYTE *rSendPack = new BYTE[200];//这里最好返回堆上的数组,不要返回栈上的数组
memset(rSendPack,0,200);

BYTE *pPos = rSendPack;

BYTE temp[200] = {0};
BYTE sendTemp;
BYTE temppaddsum = 0;
BYTE temppxorsum = 0;

if (Type = 'A')
{
*pPos ++ = 0xFF;
*pPos ++ = 0x30;
*pPos ++ = 43;
*pPos ++ = 0x02;
*pPos ++ = 0x01;
}

return rSendPack;//返回堆上数组,记得在函数外面释放空间
}
纯冰糖 2008-12-17
  • 打赏
  • 举报
回复
再顶,急!
纯冰糖 2008-12-16
  • 打赏
  • 举报
回复
继续顶顶,实在写不出来了,哪位朋友给帮帮忙吧。
ivan_08 2008-12-15
  • 打赏
  • 举报
回复
学习
zoulie 2008-12-15
  • 打赏
  • 举报
回复
一行一行转换了
纯冰糖 2008-12-15
  • 打赏
  • 举报
回复
帮忙看看吧,长一点,但逻辑不难,就是数值转换的,
vc里写
BYTE[] SetupPack(char Type);函数就出错,不知道VC的BYTE和C#的byte[]怎么转换啊
oyljerry 2008-12-15
  • 打赏
  • 举报
回复
vc中也有BYTE typedef unsigned char BYTE;
纯冰糖 2008-12-15
  • 打赏
  • 举报
回复
想直接使用VC6的BYTE[]去写,调试时是乱码,想不通~~请各位帮忙。
CodeProject-Jerry 2008-12-15
  • 打赏
  • 举报
回复
这个是Managed C++

不是Native C++

VC6是没有.Net支持的。

你只能按照源代码的意思 一行一行的转换成Native C++

如Convert.ToString(S_RecPack[5]);

只能写成
CString s;
s.Format( _T("%s"), S_RecPack[5]);
之类的

andywei1982 2008-12-15
  • 打赏
  • 举报
回复
看清楚逻辑重写吧,没有什么自动化的转换工具,语法都不同,你这个代码不多,应该很快,
纯冰糖 2008-12-15
  • 打赏
  • 举报
回复

//写成VC的,rSendPack在调试时是乱码,不知道在VC里怎么用C#的byte[]类型数据

//打包
BYTE CNetBrgSetParamDlg::SetupPack(char Type)
{
BYTE RStr,PBody,PTrail;
BYTE PHead[100] = {0};
BYTE rSendPack[200]={0};
BYTE temp[200]={0};
BYTE sendTemp;
BYTE tempaddsum=0;
BYTE tempxorsum=0;
CCheck check;


//设置参数包
if(Type=='A')
{
if(nSetFlag==1)
{
//包体
rSendPack[0]=0xFF;
rSendPack[1]=0x30;
rSendPack[2]=43;
rSendPack[3]=0x02;
rSendPack[4]=0x01;

//ClientIP
int nClientIP1Len=strlen(strClientIP1);
memcpy(rSendPack,strClientIP1,nClientIP1Len);
}
if(nSetFlag==0)
{

}
}

//搜索包
if(Type=='S')
{
rSendPack[0]=0xFF;
rSendPack[1]=0x30;
rSendPack[2]=4;
rSendPack[3]=0x01;
// strcpy(temp,rSendPack);
check.AddSum(temp,4,tempaddsum);
check.XorSum(temp,4,tempxorsum);
rSendPack[4]=tempaddsum;
rSendPack[5]=tempxorsum;
}

return rSendPack[200];
}


tian_fang 2008-12-15
  • 打赏
  • 举报
回复
学习
闪破风浪 2008-12-15
  • 打赏
  • 举报
回复
不懂
纯冰糖 2008-12-15
  • 打赏
  • 举报
回复

//解包函数
private int unpack(byte[] S_RecPack)
{
CCheck uncheck = new CCheck();
DB_class mydb = new DB_class();
OleDbConnection ole_con=new OleDbConnection ();
string[] split = null;
string substr = "\n", Command;
char[] del = substr.ToCharArray();//将字符串分解为数组
byte[] tempbuff = new byte[100], unbuff = null, rTempBuff = new byte[100];
byte addsum=0,xorsum=0;
int rsult=0;

//检查包类型0xff30是下行包,0xff40是上行包
if ((S_RecPack[0].ToString() != "255")&&(S_RecPack[1].ToString() != "40"))
{
return rsult = -1;

}

//检查校验
int len=Convert.ToInt32(S_RecPack[2]);
Buffer.BlockCopy(S_RecPack, 0, rTempBuff, 0, S_RecPack.Length-2);
addsum= S_RecPack[len];
xorsum=S_RecPack[len+1];
if ((uncheck.AddSum(rTempBuff, len, ref addsum) != true) && (uncheck.XorSum(rTempBuff, len, ref xorsum) != true))
{
MessageBox.Show("数据校验错误!","参数设置");
rsult= - 2;
return rsult;
}
Command = Convert.ToString( S_RecPack[3]);
switch(Command)
{
case "2"://收到设置包

int flag = Convert.ToInt32(S_RecPack[6]);
if (flag == 0)//服务机设置成功
{
//发送搜索包SendPack();
MessageBox.Show("服务机设置成功!", "参数设置");
if (myset.SetIDFlag == true)
{
//新设置id号
// MessageBox.Show("服务机设置成功!","参数设置");
int r_newid = Convert.ToUInt16(S_RecPack[4] * 256 + S_RecPack[5]);
//添加数据库
try
{
mydb.ConnectDB(ref ole_con);
if (mydb.InsertID(ole_con, r_newid))
{

}

p_type = 'S';
this.listView1.Items.Clear();
tempbuff = SetupPack(p_type);
SendPack(tempbuff);
}
catch
{
p_type = 'S';
this.listView1.Items.Clear();
tempbuff = SetupPack(p_type);
SendPack(tempbuff);
MessageBox.Show("网络信息设置异常!", "参数设置");
}
}
else
{
p_type = 'S';
this.listView1.Items.Clear();
tempbuff = SetupPack(p_type);
SendPack(tempbuff);

}

}
else
{

rsult= - 3;
MessageBox.Show("服务机设置失败,请重试!", "参数设置");
return rsult;
}
break;
case "1"://收到搜索包
//刷新显示
string strtem = Encoding.ASCII.GetString(S_RecPack);

//strtem = Convert.ToString(S_RecPack, 10);
sSetIp[0] = Convert.ToString(S_RecPack[4]);//设置标志

sSetIp[1] = Convert.ToString(S_RecPack[5]);//cilentip
sSetIp[2] = Convert.ToString(S_RecPack[6]);
sSetIp[3] = Convert.ToString(S_RecPack[7]);
sSetIp[4] = Convert.ToString(S_RecPack[8]);

sSetIp[5] = Convert.ToString(S_RecPack[9]);//子网掩码
sSetIp[6] = Convert.ToString(S_RecPack[10]);
sSetIp[7] = Convert.ToString(S_RecPack[11]);
sSetIp[8] = Convert.ToString(S_RecPack[12]);

sSetIp[9] = Convert.ToString(S_RecPack[13]);//网关
sSetIp[10] = Convert.ToString(S_RecPack[14]);
sSetIp[11] = Convert.ToString(S_RecPack[15]);
sSetIp[12] = Convert.ToString(S_RecPack[16]);

//Mac地址
StringBuilder sb = new StringBuilder();

Array.Reverse(S_RecPack,17,1);
foreach (byte b in S_RecPack)
sb.AppendFormat("{0:x2}", b);
sSetIp[13] = sb.ToString(34, 2);
sSetIp[14] = sb.ToString(36, 2);
sSetIp[15] = sb.ToString(38, 2);
sSetIp[16] = sb.ToString(40, 2);
sSetIp[17] = sb.ToString(42, 2);
sSetIp[18] = sb.ToString(44, 2);

////网桥ID号
sSetIp[19] = Convert.ToString(S_RecPack[23] * 256 + S_RecPack[24]);



sSetIp[21]= Convert.ToString(S_RecPack[25]);//服务器IP地址
sSetIp[22] = Convert.ToString(S_RecPack[26]);
sSetIp[23] = Convert.ToString(S_RecPack[27]);
sSetIp[24]= Convert.ToString(S_RecPack[28]);

sSetIp[25] = Convert.ToString(S_RecPack[29] * 256 + S_RecPack[30]);//服务器端口号

//终端名称
byte[] bTemp=new byte[50] ;
Buffer.BlockCopy(S_RecPack, 31, bTemp, 0, 10);
sSetIp[26] = Encoding.Default.GetString(bTemp, 0, 10);

return rsult = 1;

break;
default:
return rsult=-4;
break;

}//switch(Command)


return rsult;


}


纯冰糖 2008-12-15
  • 打赏
  • 举报
回复
C# byte 转 C++ BYTE 哪位朋友知道啊?

BYTE rSendPack[200]={0};
BYTE temp[200]={0};
BYTE sendTemp;
BYTE tempaddsum=0;
BYTE tempxorsum=0;
CCheck check;


//设置参数包
if(Type=='A')
{
if(nSetFlag==1)
{
//包体
rSendPack[0]=0xFF;
rSendPack[1]=0x30;
rSendPack[2]=43;
rSendPack[3]=0x02;
rSendPack[4]=0x01;
}
我修改的调试时就是有错误啊~~

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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