有C的程序,但转换不过来,谁有转换好的代码或者帮忙转换一下,谢谢!
C的程序代码
http://www.virtualconspiracy.com/download/scrdec18.c

解决方案 »

  1.   

    public class JSDecoder
    {
    private const int STATE_COPY_INPUT = 100;
    private const int STATE_READLEN = 101;
    private const int STATE_DECODE = 102;
    private const int STATE_UNESCAPE = 103;

    private int[] Pick_Encoding;
    private int[] rawData;
    private int[,] Transformed = new int[3, 288];
    private int[] Digits = new int[123];

    public JSDecoder()
    {
    InitArrayData();
    }
    private void InitArrayData()
    {
    int i;
    int j;
    Pick_Encoding = new int[] { 1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0, 1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2, 1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2, 1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2 };

    rawData = new int[] { 0x64, 0x37, 0x69, 0x50, 0x7E, 0x2C, 0x22, 0x5A, 0x65, 0x4A, 0x45, 0x72, 0x61, 0x3A, 0x5B, 0x5E, 0x79, 0x66, 0x5D, 0x59, 0x75, 0x5B, 0x27, 0x4C, 0x42, 0x76, 0x45, 0x60, 0x63, 0x76, 0x23, 0x62, 0x2A, 0x65, 0x4D, 0x43, 0x5F, 0x51, 0x33, 0x7E, 0x53, 0x42, 0x4F, 0x52, 0x20, 0x52, 0x20, 0x63, 0x7A, 0x26, 0x4A, 0x21, 0x54, 0x5A, 0x46, 0x71, 0x38, 0x20, 0x2B, 0x79, 0x26, 0x66, 0x32
    , 0x63, 0x2A, 0x57, 0x2A, 0x58, 0x6C, 0x76, 0x7F, 0x2B, 0x47, 0x7B, 0x46, 0x25, 0x30, 0x52, 0x2C, 0x31, 0x4F, 0x29, 0x6C, 0x3D, 0x69, 0x49, 0x70, 0x3F, 0x3F, 0x3F, 0x27, 0x78, 0x7B, 0x3F, 0x3F, 0x3F, 0x67, 0x5F, 0x51, 0x3F, 0x3F, 0x3F, 0x62, 0x29, 0x7A, 0x41, 0x24, 0x7E, 0x5A, 0x2F, 0x3B, 0x66, 0x39, 0x47, 0x32, 0x33, 0x41, 0x73, 0x6F, 0x77, 0x4D, 0x21, 0x56, 0x43, 0x75, 0x5F
    , 0x71, 0x28, 0x26, 0x39, 0x42, 0x78, 0x7C, 0x46, 0x6E, 0x53, 0x4A, 0x64, 0x48, 0x5C, 0x74, 0x31, 0x48, 0x67, 0x72, 0x36, 0x7D, 0x6E, 0x4B, 0x68, 0x70, 0x7D, 0x35, 0x49, 0x5D, 0x22, 0x3F, 0x6A, 0x55, 0x4B, 0x50, 0x3A, 0x6A, 0x69, 0x60, 0x2E, 0x23, 0x6A, 0x7F, 0x9, 0x71, 0x28, 0x70, 0x6F, 0x35, 0x65, 0x49, 0x7D, 0x74, 0x5C, 0x24, 0x2C, 0x5D, 0x2D, 0x77, 0x27, 0x54, 0x44, 0x59
    , 0x37, 0x3F, 0x25, 0x7B, 0x6D, 0x7C, 0x3D, 0x7C, 0x23, 0x6C, 0x43, 0x6D, 0x34, 0x38, 0x28, 0x6D, 0x5E, 0x31, 0x4E, 0x5B, 0x39, 0x2B, 0x6E, 0x7F, 0x30, 0x57, 0x36, 0x6F, 0x4C, 0x54, 0x74, 0x34, 0x34, 0x6B, 0x72, 0x62, 0x4C, 0x25, 0x4E, 0x33, 0x56, 0x30, 0x56, 0x73, 0x5E, 0x3A, 0x68, 0x73, 0x78, 0x55, 0x9, 0x57, 0x47, 0x4B, 0x77, 0x32, 0x61, 0x3B, 0x35, 0x24, 0x44, 0x2E, 0x4D
    , 0x2F, 0x64, 0x6B, 0x59, 0x4F, 0x44, 0x45, 0x3B, 0x21, 0x5C, 0x2D, 0x37, 0x68, 0x41, 0x53, 0x36, 0x61, 0x58, 0x58, 0x7A, 0x48, 0x79, 0x22, 0x2E, 0x9, 0x60, 0x50, 0x75, 0x6B, 0x2D, 0x38, 0x4E, 0x29, 0x55, 0x3D, 0x3F };

    for (i = 31; i <= 126; i++)
    {
    for (j = 0; j <= 2; j++)
    {
    Transformed[j, rawData[(i - 31) * 3 + j]] = i == 31 ? 9 : i;
    }
    }
    for (i = 0; i <= 25; i++)
    {
    Digits[65 + i] = i;
    Digits[97 + i] = i + 26;
    }
    for (i = 0; i <= 9; i++)
    {
    Digits[48 + i] = i + 52;
    }
    Digits[43] = 62;
    Digits[47] = 63;
    }
    private string UnEscape(string strChar)
    {
    string escapes;
    string escaped;
    int iIndex;
    escapes = "#&!*$";
    escaped = '\r' + '\n' + "<>@";
    if (Strings.AscW(strChar.Substring(0, 1)) > 126)
    {
    return strChar;
    }
    iIndex = escapes.IndexOf(strChar);
    if (iIndex != - 1)
    {
    return escaped.Substring(iIndex, 1);
    }
    return "?";
    }

    private int DecodeBase64(string strString)
    {
    int iVal = 0;
    iVal += Digits[Strings.AscW(strString.Substring(0, 1))] << 2;
    iVal += Digits[Strings.AscW(strString.Substring(1, 1))] >> 4;
    iVal += (Digits[Strings.AscW(strString.Substring(1, 1))] & 0xF) << 12;
    iVal += (Digits[Strings.AscW(strString.Substring(2, 1))] >> 2) << 8;
    iVal += (Digits[Strings.AscW(strString.Substring(2, 1))] & 0x3) << 22;
    iVal += Digits[Strings.AscW(strString.Substring(3, 1))] << 16;
    return iVal;

    }

    public string Decode(string encodingString)
    {

                   string unEncodingString = "";
    string Pattern; unEncodingString = DecodeProcedure(encodingString);
    Pattern = "(JScript|VBscript).encode";
    unEncodingString = System.Text.RegularExpressions.Regex.Replace(unEncodingString, Pattern, "$1", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    return unEncodingString;
    } private string DecodeProcedure( string encodingString)
    {
    string er = "#@~^";
    int stringIndex = 0;
    int scriptIndex = - 1;
    int unEncodingIndex = 0;
    string strChar = "";
    string getCodeString = "";
    int unEncodinglength = 0;

    int state = 100;
    string unEncodingString = "";

    while (state != 0)
    {
    switch (state)
    {
    case STATE_COPY_INPUT:

    if (stringIndex<0 || stringIndex >= encodingString.Length)
    {
    state = 0;
    return unEncodingString;
    }
    scriptIndex = encodingString.IndexOf(er, stringIndex);
    if (scriptIndex != - 1)
    {
    if (stringIndex+1-1<0 || scriptIndex - stringIndex >= encodingString.Length)
    {
    state = 0;
    return unEncodingString;
    }
    unEncodingString += encodingString.Substring(stringIndex + 1 - 1, scriptIndex - stringIndex);
    scriptIndex += er.Length;
    state = STATE_READLEN;
    }
    else
    {
    if ( stringIndex+1-1<0 || stringIndex+1-1 >=encodingString.Length)
    {
    state = 0;
    return unEncodingString;
    }
    stringIndex = stringIndex == 0 ? 0 : stringIndex;
    unEncodingString += encodingString.Substring(stringIndex + 1 - 1);
    state = 0;
    }
    break;
    case STATE_READLEN:

    if ( stringIndex+1-1<0 || stringIndex+1-1 >=encodingString.Length)
    {
    state = 0;
    return unEncodingString;
    }
    getCodeString = encodingString.Substring(scriptIndex + 1 - 1, 6);
    unEncodinglength = DecodeBase64(getCodeString);
    scriptIndex += 8;
    state = STATE_DECODE;
    break;
    case STATE_DECODE:

    if (unEncodinglength == 0)
    {
    stringIndex = scriptIndex + "DQgAAA==^#~@".Length;
    unEncodingIndex = 0;
    state = STATE_COPY_INPUT;
    }
    else
    {
    if ( stringIndex+1-1<0 || scriptIndex + 1 - 1 >= encodingString.Length )
    {
    state = 0;
    return unEncodingString;
    }
    strChar = encodingString.Substring(scriptIndex + 1 - 1, 1);
    if (strChar == "@")
    {
    state = STATE_UNESCAPE;
    unEncodingString += UnEscape(encodingString.Substring(scriptIndex + 2 - 1, 1));
    scriptIndex += 2;
    unEncodinglength -= 2;
    unEncodingIndex++;
    state = STATE_DECODE;
    }
    else
    {
    if (Strings.AscW(strChar) < 0xFF)
    {
    unEncodingString += Strings.Chr(Transformed[Pick_Encoding[unEncodingIndex % 64], Strings.AscW(strChar)]);
    unEncodingIndex++;
    }
    else
    {
    unEncodingString += strChar;
    }
    scriptIndex++;
    unEncodinglength--;
    }
    }
    break;
    case STATE_UNESCAPE:

    if ( stringIndex+1-1<0 )
    {
    state = 0;
    return unEncodingString;
    }
    unEncodingString += UnEscape(encodingString.Substring( ++scriptIndex - 1, 1));
    scriptIndex++;
    unEncodinglength -= 2;
    unEncodingIndex++;
    state = STATE_DECODE;
    break;
    }
    }
    return unEncodingString;
    }
    }