C++代码转成C#问题!!!

mzwww 2019-01-16 09:43:51
帮忙转换成C#,谢谢!!
void CClientRegicode::EncodeBase64MSG(char *Src,int Src_len,char *base64code)
{
int len,i,work_Len;
unsigned char* psrc ;
unsigned char Beign;
unsigned char rest ;
const char szBase64TableOld2[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; //$ 标准
const char szBase64TableOld [] = {'P','Q','R','S','T','U','a','b','c','d','e','f','g','h','A','B','C','D','E','K','L','M','y','z',
'0','1','N','O','V','W','X','Y','Z','i','j','k','q','r','s','5','6','7','8','9','t','u','v','w',
'x','2','3','4','+','/','F','G','H','I','J','l','m','n','o','p'}; //- * 变化
char szBase64Table [] = {'P','Q','R','S','T','U','a','b','c','d','e','f','g','h','A','B','C','D','E','K','L','M','y','z',
'0','1','N','O','V','W','X','Y','Z','i','j','k','q','r','s','5','6','7','8','9','t','u','v','w',
'x','2','3','4','+','/','F','G','H','I','J','l','m','n','o','p'}; //- * 变化
work_Len = Src_len;

if (Src[4]=='-'||Src[4]=='*'||Src[4]=='$')
{
psrc = (unsigned char*)&Src[5]; work_Len=work_Len-5;
*base64code=Src[0];base64code++;
*base64code=Src[1];base64code++;
*base64code=Src[2];base64code++;
*base64code=Src[3];base64code++;
*base64code=Src[4];base64code++;
i=atoi(Src) % 63;
if (i!=0)
{
if (Src[4]=='$')
{
memcpy(szBase64Table ,&szBase64TableOld2[i],64-i);
memcpy(&szBase64Table[64-i],szBase64TableOld2 ,i);
}
else
{
memcpy(szBase64Table ,&szBase64TableOld[i],64-i);
memcpy(&szBase64Table[64-i],szBase64TableOld ,i);
}
}
if (Src[4]=='*')
{
char buf[3];buf[2]=0;
len =1;*psrc++;
for (i = 1; i < work_Len ; i=i+2)
{
memcpy(buf,&Src[5+i],2);
*psrc=(unsigned char) (strtoul(buf,NULL,16));
*psrc++;
len++;
}
psrc = (unsigned char*)&Src[5];
work_Len=len;
}
}
else
psrc = (unsigned char*)Src;

rest=0;
Beign=0;
len = 0;
for (i = 0; i < work_Len ; i ++)
{
do
{
*base64code=szBase64Table[ ( Beign<<(6-rest) | *psrc>>(2+rest))&0x3f];
base64code++;
len++;
Beign=*psrc;
rest+=2;
if (rest==8)
{
rest=0;

}
} while (rest>=6);
psrc++;
}
if (rest!=0)
{
*base64code=szBase64Table[ ( Beign<<(6-rest) )&0x3f];
base64code++;
len++;
}
if (((len/4)*4)!=len)
for (i=0;i<((len/4)+1)*4-len;i++)
{
*base64code='=';
base64code++;
}
*base64code = '\0';
}
...全文
275 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mzwww 2019-01-16
  • 打赏
  • 举报
回复
能不用unsafe和指针吗?谢谢!
mzwww 2019-01-16
  • 打赏
  • 举报
回复
能不用unsafe和指针吗?谢谢!
ilikeff8 2019-01-16
  • 打赏
  • 举报
回复
如果图省事就用unsafe,大体是

unsafe void EncodeBase64MSG(char* Src, int Src_len, char* base64code)
{
int len, i, work_Len;
byte* psrc;
byte Beign;
byte rest;
char[] szBase64TableOld2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".ToArray(); //$ 标准
char[] szBase64TableOld = {'P','Q','R','S','T','U','a','b','c','d','e','f','g','h','A','B','C','D','E','K','L','M','y','z',
'0','1','N','O','V','W','X','Y','Z','i','j','k','q','r','s','5','6','7','8','9','t','u','v','w',
'x','2','3','4','+','/','F','G','H','I','J','l','m','n','o','p'}; //- * 变化
char[] szBase64Table = {'P','Q','R','S','T','U','a','b','c','d','e','f','g','h','A','B','C','D','E','K','L','M','y','z',
'0','1','N','O','V','W','X','Y','Z','i','j','k','q','r','s','5','6','7','8','9','t','u','v','w',
'x','2','3','4','+','/','F','G','H','I','J','l','m','n','o','p'}; //- * 变化
work_Len = Src_len;

if (Src[4] == '-' || Src[4] == '*' || Src[4] == '$')
{
psrc = (byte*)&Src[5]; work_Len = work_Len - 5;
*base64code = Src[0]; base64code++;
*base64code = Src[1]; base64code++;
*base64code = Src[2]; base64code++;
*base64code = Src[3]; base64code++;
*base64code = Src[4]; base64code++;
i = Convert.ToInt32(Src[0]) % 63;
if (i != 0)
{
if (Src[4] == '$')
{
Buffer.BlockCopy(szBase64TableOld2, i, szBase64Table, 0, 64 - i);
Buffer.BlockCopy(szBase64TableOld2, 0, szBase64Table, 64 - i, i);
}
else
{
Buffer.BlockCopy(szBase64TableOld, i, szBase64Table, 0, 64 - i);
Buffer.BlockCopy(szBase64TableOld, 0, szBase64Table, 64 - i, i);
}
}
if (Src[4] == '*')
{
char[] buf = new char[3]; buf[2] = '\0';
len = 1; psrc++;
for (i = 1; i < work_Len; i = i + 2)
{
buf[0] = Src[5 + i];
buf[1] = Src[5 + i + 1];

*psrc = Convert.ToByte(buf[0].ToString() + buf[1].ToString(), 16);

psrc++;
len++;
}
psrc = (byte*)&Src[5];
work_Len = len;
}
}
else
psrc = (byte*)Src;

rest = 0;
Beign = 0;
len = 0;
for (i = 0; i < work_Len; i++)
{
do
{
*base64code = szBase64Table[(Beign << (6 - rest) | *psrc >> (2 + rest)) & 0x3f];
base64code++;
len++;
Beign = *psrc;
rest += 2;
if (rest == 8)
{
rest = 0;

}
} while (rest >= 6);
psrc++;
}
if (rest != 0)
{
*base64code = szBase64Table[(Beign << (6 - rest)) & 0x3f];
base64code++;
len++;
}
if (((len / 4) * 4) != len)
for (i = 0; i < ((len / 4) + 1) * 4 - len; i++)
{
*base64code = '=';
base64code++;
}
*base64code = '\0';
}
xuzuning 2019-01-16
  • 打赏
  • 举报
回复
你应该贴出解码程序作为参考
mzwww 2019-01-16
  • 打赏
  • 举报
回复
帮忙顶上去!
mzwww 2019-01-16
  • 打赏
  • 举报
回复
请老师们帮忙!
mzwww 2019-01-16
  • 打赏
  • 举报
回复
就提供一段这样的代码给我,重新放到自己 的程序里,所以需要重写成C#。
mzwww 2019-01-16
  • 打赏
  • 举报
回复
大神呢????
mzwww 2019-01-16
  • 打赏
  • 举报
回复
没人理?????
xian_wwq 2019-01-16
  • 打赏
  • 举报
回复
如果不是强制性要求 个人感觉不需要转代码 把函数放到c dll中,对外提供extern c 的接口 c#通过PInvoke调用就好了

110,536

社区成员

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

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

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