读书人

帮忙将C代码转成C#呀!解决思路

发布时间: 2012-05-29 12:16:00 作者: rapoo

帮忙将C代码转成C#,急呀!

C 代码如下,小弟自己手工转换后很多错误,请大家帮帮忙,非常感谢!

C/C++ code
//反Base64数组,可以优化,变成全局,一次生成char ReverseBase[256];//函数所用到的变量初始化int Funs_Gps_Init(){    Base64Init();    return 1;}//转义函数int Transfer7D(char *NewBuf,const char *p_OldBuf,int OldLen){    unsigned char* OldBuf=(unsigned char*)p_OldBuf;    int Offset=0;    for(int i=0;i<OldLen;i++)    {        if(OldBuf[i] ==0x7d || OldBuf[i] ==0x7e || OldBuf[i] ==0x7f)        {            //需要转义            NewBuf[Offset++]=0x7D;            NewBuf[Offset++]=OldBuf[i] ^ 0x20;        }else        {            NewBuf[Offset++]=OldBuf[i];        }    }    return Offset;}//翻转义int Restore7D(const char* pBuff,int BuffLen,char* Dest){    unsigned char *Src=(unsigned char *)pBuff;    int i=0;    int iDest=0;    for(;i<BuffLen;++i,++iDest)    {        if(*(Src+i)==0x7D)        {            ++i;            *(Dest+iDest)=*(Src+i) ^ 0x20;        }else        {            *(Dest+iDest)=*(Src+i);        }    }    return iDest;}//在反Base64时的数组初始化int Base64Init(){    char Base[]=     {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',     'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',     'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',     'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/','='};    char i=0;    for(;i<sizeof(Base)-1;++i)    {        ReverseBase[Base[i]]=i;    }    return 1;}//一种编码方式int ToBase64(const char * Buf,int Len,char * Base64Buf){    char Base[]=     {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',     'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',     'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',     'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/','='};    //求出倍数    int Multiple3 = Len/3;    int Offset=0;    char OldTemp[3];    for(int i=0;i<Multiple3;i++)    {        memcpy(OldTemp,Buf + 3*i,3);        Base64Buf[Offset++]= Base[((OldTemp[0]>>2) & 0x3F)];        Base64Buf[Offset++]= Base[(((OldTemp[0] & 0x03 )<<4) | (OldTemp[1]>>4 & 0x0F))];        Base64Buf[Offset++]= Base[(((OldTemp[1] & 0x0F)<<2 ) | (OldTemp[2]>>6 & 0x03))] ;        Base64Buf[Offset++]= Base[((OldTemp[2]) & 0x3F)];    }    if((Len%3)==0)    {    }    else if((Len % 3)==1)    {        memcpy(OldTemp,Buf + Multiple3 * 3 ,1);        //用来补        //OldTemp[1] = OldTemp[2] = '=';        Base64Buf[Offset++]= Base[((OldTemp[0]>>2) & 0x3F)];        Base64Buf[Offset++]= Base[(((OldTemp[0] & 0x03 )<<4) )];        Base64Buf[Offset++]= '=';        Base64Buf[Offset++]= '=';    }    else    {        memcpy(OldTemp,Buf +  Multiple3 * 3,2);        //用来补        //OldTemp[2] = '=';        Base64Buf[Offset++]= Base[((OldTemp[0]>>2) & 0x3F)];        Base64Buf[Offset++]= Base[(((OldTemp[0] & 0x03 )<<4) | (OldTemp[1]>>4 & 0x0F))];        Base64Buf[Offset++]= Base[(((OldTemp[1] & 0x0F)<<2 ) )] ;        Base64Buf[Offset++]= '=';    }    return Offset;}//反Base64编码int FromBase64(const char* Buf,int Len,char* HexBuf){    if(Len % 4 !=0)    {        return 0;    }    int EqualCount=0;       //数据的最后等号个数    //最后的数据    if(Buf[Len-1]=='=')    {        EqualCount++;    }    if(Buf[Len-2]=='=')    {        EqualCount++;    }    char tmp[4];    int i=0;    int offset=0;        while(offset < Len)    {        //提取出来        tmp[0]=ReverseBase[Buf[offset++]];        tmp[1]=ReverseBase[Buf[offset++]];        tmp[2]=ReverseBase[Buf[offset++]];        tmp[3]=ReverseBase[Buf[offset++]];                //3f=00111111  0x30=00110000        HexBuf[i++]=((tmp[0] & 0x3F )<<2) | ((tmp[1] & 0x30)>>4);        //0f=00001111 3C=00111100        HexBuf[i++]=((tmp[1] & 0x0F )<<4) | ((tmp[2] & 0x3C)>>2);        //00000011   3f=00111111        HexBuf[i++]=((tmp[2] & 0x03 )<<6) | ((tmp[3] & 0x3f)>>0);    }    //assert(i==Len/4*3);    return i-EqualCount;}//加密int DB44Encode(char* Buff,int Len,unsigned long Key){    const unsigned long M1  =0x01000030;      const unsigned long IA1 =0x00000001;      const unsigned long IC1 =0x00000002;      //用N模伪随机序列发生器产生伪随机字节序列        unsigned short idx = 0;      if( Key == 0 ) Key = 1;      while( idx < Len )      {         Key = IA1 * ( Key % M1 ) + IC1;          Buff[idx++] ^= (unsigned char)((Key>>20)&0xFF);    }     return 1;}//加密int DB44Encode(unsigned char* Buff,int Len,unsigned long Key){    return DB44Encode((char*)Buff,Len,Key);}//解密int DB44Decode(char* Buff,int Len,unsigned long Key){    return DB44Encode(Buff,Len,Key);}//解密int DB44Decode(unsigned char* Buff,int Len,unsigned long Key){    return DB44Decode((char*)Buff,Len,Key);}const unsigned short CRC16Table[256] = {    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,    0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,    0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,    0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,    0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,    0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,    0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,    0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,    0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,    0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,    0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,    0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,    0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,    0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,    0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,    0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,    0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,    0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,    0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,    0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,    0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,    0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,    0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,    0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,    0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,    0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,    0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,    0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,    0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,    0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,    0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,    0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0};//校验,从帧头(不包含)到校验前的CRC-CNITT的校验值,高字节在前,低字节在后 //CRC-CCITT码生成多项式为x16+x12+x5+10,简记式为:1021。unsigned short GetDB44Parity(const char* Buff,int BuffLen){    unsigned short i;    unsigned short crc=0;    for(i=0;i<BuffLen;i++)    {        crc =(crc >> 8) ^ CRC16Table[(crc ^ Buff[i]) & 0xFF];      }    return(crc);} 



[解决办法]
未调试,自己完善吧
C# code
        //反Base64数组,可以优化,变成全局,一次生成        char[] ReverseBase = new char[256];        //函数所用到的变量初始化        private int Funs_Gps_Init()        {            Base64Init();            return 1;        }        //转义函数        private int Transfer7D(char[] NewBuf, char[] p_OldBuf, int OldLen)        {            char[] OldBuf = p_OldBuf;            int Offset = 0;            for (int i = 0; i < OldLen; i++)            {                if ((byte)OldBuf[i] == 0x7d || (byte)OldBuf[i] == 0x7e || (byte)OldBuf[i] == 0x7f)                {                    //需要转义                    NewBuf[Offset++] = (char)0x7D;                    NewBuf[Offset++] = (char)(OldBuf[i] ^ 0x20);                }                else                {                    NewBuf[Offset++] = OldBuf[i];                }            }            return Offset;        }        //翻转义        private int Restore7D(char[] pBuff, int BuffLen, char[] Dest)        {            char[] Src = pBuff;            int i = 0;            int iDest = 0;            for (; i < BuffLen; ++i, ++iDest)            {                if ((byte)Src[i] == 0x7D)                {                    ++i;                    Dest[iDest] = (char)(Src[i] ^ 0x20);                }                else                {                    Dest[iDest] = Src[i];                }            }            return iDest;        }        private int Base64Init()        {            char[] Base = new char[]    {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',     'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',     'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',     'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/','='};            char i = (char)0;            for (; i < Base.Length - 1; ++i)            {                ReverseBase[Base[i]] = i;            }            return 1;        }        //一种编码方式        private int ToBase64(char[] Buf, int Len, char[] Base64Buf)        {            char[] Base = new char[]     {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',     'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',     'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',     'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/','='};            //求出倍数            int Multiple3 = Len / 3;            int Offset = 0;            char[] OldTemp = new char[3];            for (int i = 0; i < Multiple3; i++)            {                Array.Copy(Buf, i * 3, OldTemp, 0, 3);                OldTemp[i] = Buf[3 * i];                Base64Buf[Offset++] = Base[((OldTemp[0] >> 2) & 0x3F)];                Base64Buf[Offset++] = Base[(((OldTemp[0] & 0x03) << 4) | (OldTemp[1] >> 4 & 0x0F))];                Base64Buf[Offset++] = Base[(((OldTemp[1] & 0x0F) << 2) | (OldTemp[2] >> 6 & 0x03))];                Base64Buf[Offset++] = Base[((OldTemp[2]) & 0x3F)];            }            if ((Len % 3) == 0)            {            }            else if ((Len % 3) == 1)            {                OldTemp[0] = Buf[3 * 3];                //用来补                //OldTemp[1] = OldTemp[2] = '=';                Base64Buf[Offset++] = Base[((OldTemp[0] >> 2) & 0x3F)];                Base64Buf[Offset++] = Base[(((OldTemp[0] & 0x03) << 4))];                Base64Buf[Offset++] = '=';                Base64Buf[Offset++] = '=';            }            else            {                Array.Copy(Buf, Multiple3 * 3, OldTemp, 0, 2);                //用来补                //OldTemp[2] = '=';                Base64Buf[Offset++] = Base[((OldTemp[0] >> 2) & 0x3F)];                Base64Buf[Offset++] = Base[(((OldTemp[0] & 0x03) << 4) | (OldTemp[1] >> 4 & 0x0F))];                Base64Buf[Offset++] = Base[(((OldTemp[1] & 0x0F) << 2))];                Base64Buf[Offset++] = '=';            }            return Offset;        }        //反Base64编码        private int FromBase64(char[] Buf, int Len, char[] HexBuf)        {            if (Len % 4 != 0)            {                return 0;            }            int EqualCount = 0;       //数据的最后等号个数            //最后的数据            if (Buf[Len - 1] == '=')            {                EqualCount++;            }            if (Buf[Len - 2] == '=')            {                EqualCount++;            }            char[] tmp = new char[4];            int i = 0;            int offset = 0;            while (offset < Len)            {                //提取出来                tmp[0] = ReverseBase[Buf[offset++]];                tmp[1] = ReverseBase[Buf[offset++]];                tmp[2] = ReverseBase[Buf[offset++]];                tmp[3] = ReverseBase[Buf[offset++]];                //3f=00111111  0x30=00110000                HexBuf[i++] = (char)(((tmp[0] & 0x3F) << 2) | ((tmp[1] & 0x30) >> 4));                //0f=00001111 3C=00111100                HexBuf[i++] = (char)(((tmp[1] & 0x0F) << 4) | ((tmp[2] & 0x3C) >> 2));                //00000011   3f=00111111                HexBuf[i++] = (char)(((tmp[2] & 0x03) << 6) | ((tmp[3] & 0x3f) >> 0));            }            //assert(i==Len/4*3);            return i - EqualCount;        }        //加密        private int DB44Encode(char[] Buff, int Len, ulong Key)        {            ulong M1 = 0x01000030;            ulong IA1 = 0x00000001;            ulong IC1 = 0x00000002;            //用N模伪随机序列发生器产生伪随机字节序列                ushort idx = 0;            if (Key == 0) Key = 1;            while (idx < Len)            {                Key = IA1 * (Key % M1) + IC1;                Buff[idx++] ^= (char)((Key >> 20) & 0xFF);            }            return 1;        }        //加密        private int DB44Encode(byte[] Buff, int Len, ulong Key)        {            return DB44Encode(Buff, Len, Key);        }        //解密        private int DB44Decode(char[] Buff, int Len, ulong Key)        {            return DB44Encode(Buff, Len, Key);        }        //解密        private int DB44Decode(byte[] Buff, int Len, ulong Key)        {            return DB44Decode(Buff, Len, Key);        }        ushort[] CRC16Table = new ushort[256] {    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,    0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,    0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,    0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,    0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,    0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,    0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,    0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,    0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,    0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,    0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,    0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,    0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,    0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,    0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,    0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,    0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,    0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,    0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,    0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,    0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,    0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,    0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,    0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,    0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,    0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,    0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,    0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,    0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,    0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,    0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,    0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0};        //校验,从帧头(不包含)到校验前的CRC-CNITT的校验值,高字节在前,低字节在后         //CRC-CCITT码生成多项式为x16+x12+x5+10,简记式为:1021。        private ushort GetDB44Parity(char[] Buff, int BuffLen)        {            ushort i;            ushort crc = 0;            for (i = 0; i < BuffLen; i++)            {                crc = (ushort)((crc >> 8) ^ CRC16Table[(crc ^ Buff[i]) & 0xFF]);            }            return (crc);        } 


[解决办法]

//反Base64数组,可以优化,变成全局,一次生成
char[] ReverseBase = new char[256];

//函数所用到的变量初始化
int Funs_Gps_Init()
{
Base64Init();
return 1;
}
//转义函数
int Transfer7D(char[] NewBuf, char[] p_OldBuf, int OldLen)
{
char[] OldBuf = p_OldBuf;
int Offset = 0;
for (int i = 0; i < OldLen; i++)
{
if (OldBuf[i] == 0x7d || OldBuf[i] == 0x7e || OldBuf[i] == 0x7f)
{
//需要转义
NewBuf[Offset++] = Convert.ToChar(0x7D);
NewBuf[Offset++] = Convert.ToChar(OldBuf[i] ^ 0x20);

}
else
{
NewBuf[Offset++] = OldBuf[i];
}
}
return Offset;
}


//翻转义
int Restore7D(char[] pBuff,int BuffLen,char[] Dest)
{
char[] Src= pBuff;
int i=0;
int iDest=0;
for(;i<BuffLen;++i,++iDest)
{
if(Src[i]==0x7D)
{
++i;
Dest[iDest] = Convert.ToChar(Src[i] ^ 0x20);
}else
{
Dest[iDest] = Convert.ToChar(Src[i]);
}
}

return iDest;
}

//在反Base64时的数组初始化
int Base64Init()
{
char[] Base =
{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/','='};


for (int i = 0; i < Base.Count() - 1; ++i)
{
ReverseBase[Base[i]] = Convert.ToChar(i);
}
return 1;
}
不知道对不……
[解决办法]
C的char是不是应该对应C#的byte呢?
C#里面的char貌似和和int一样大的说……

读书人网 >C#

热点推荐