返回顶部

收藏

LZW+DES+Base64编码解码剪贴板文本

更多

可用于在有限的网络权限下加密传输文本。

encodeDESstr.cpp

// encodeDESstr.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "encodeDESstr.h"
#include <string>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std; 
//编码表
const char EncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
unsigned char Tmp1,Tmp2,Tmp3;
string strEncode;
int LineLength=0;

void set1st(unsigned char c)
{
    Tmp1 = c;
}

void set2nd(unsigned char c)
{
    Tmp2 = c;
}

void set3rd(unsigned char c)
{
    Tmp3 = c;
    strEncode+= EncodeTable[Tmp1 >> 2];
    strEncode+= EncodeTable[((Tmp1 << 4) | (Tmp2 >> 4)) & 0x3F];
    strEncode+= EncodeTable[((Tmp2 << 2) | (Tmp3 >> 6)) & 0x3F];
    strEncode+= EncodeTable[Tmp3 & 0x3F];
    if(LineLength+=4,LineLength==76) 
    {
        strEncode+="\r\n";
        LineLength=0;
    }
}

void (*base64_func[])(unsigned char c)={
    set1st,set2nd,set3rd
};

long n=0;
long counter=0;
char srcBytes[8] = {0};
char szLast8Bits[8] = {0};
char szSubKeys[16][48];//储存16组48位密钥
char szCiphertextRaw[64]; //储存二进制密文(64个Bits) int 0,1
char szCiphertextInBytes[8];//储存8位密文
char szPlaintextInBytes[8];//储存8位明文字符串
char szPlaintext[9];//储存8位明文字符串,最后一位存'\0'

// permuted choice table (PC1)
const static char PC1_Table[56] = {
    57, 49, 41, 33, 25, 17,  9,  1, 58, 50, 42, 34, 26, 18,
    10,  2, 59, 51, 43, 35, 27, 19, 11,  3, 60, 52, 44, 36,
    63, 55, 47, 39, 31, 23, 15,  7, 62, 54, 46, 38, 30, 22,
    14,  6, 61, 53, 45, 37, 29, 21, 13,  5, 28, 20, 12,  4
};
// permuted choice key (PC2)
const static char PC2_Table[48] = {
    14, 17, 11, 24,  1,  5,  3, 28, 15,  6, 21, 10,
    23, 19, 12,  4, 26,  8, 16,  7, 27, 20, 13,  2,
    41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
    44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
};
// number left rotations of pc1 
const static char Shift_Table[16] = {
    1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
};
// initial permutation (IP)
const static char IP_Table[64] = {
    58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
    62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
    57, 49, 41, 33, 25, 17,  9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
    61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
};
// expansion operation matrix (E)
const static char E_Table[48] = {
    32,  1,  2,  3,  4,  5,  4,  5,  6,  7,  8,  9,
    8,  9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
    16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,
    24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32,  1
};
// The (in)famous S-boxes 
const static char S_Box[8][4][16] = {
    // S1
    14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
    0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
    4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
    15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13,
    // S2 
    15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
    3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
    0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
    13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9,
    // S3 
    10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
    13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
    13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
    1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12,
    // S4 
    7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
    13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
    10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
    3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14,
    // S5 
    2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
    14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
    4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
    11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3,
    // S6 
    12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
    10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
    9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
    4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13,
    // S7 
    4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
    13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
    1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
    6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12,
    // S8 
    13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
    1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
    7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
    2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11
};
// 32-bit permutation function P used on the output of the S-boxes 
const static char P_Table[32] = {
    16, 7, 20, 21, 29, 12, 28, 17, 1,  15, 23, 26, 5,  18, 31, 10,
    2,  8, 24, 14, 32, 27, 3,  9,  19, 13, 30, 6,  22, 11, 4,  25
};
// final permutation IP^-1 
const static char IPR_Table[64] = {
    40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,
    38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,
    36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,
    34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41,  9, 49, 17, 57, 25
};

void DES_Bytes2Bits(char *srcBytes, char* dstBits, unsigned int sizeBits)
{
    unsigned int i=0;
    for(i=0; i < sizeBits; i++)
        dstBits[i] = ((srcBytes[i>>3]<<(i&7)) & 128)>>7;
}

void DES_CreateSubKey(char* sz_56key)
{
    char szTmpL[28] = {0};
    char szTmpR[28] = {0};
    char szCi[28] = {0};
    char szDi[28] = {0};
    char szTmp56[56] = {0};
    int i=0,j=0;

    memcpy(szTmpL,sz_56key,28);
    memcpy(szTmpR,sz_56key + 28,28);

    for(i=0;i<16;i++)
    {
        //shift to left
        //Left 28 bits
        memcpy(szCi,szTmpL + Shift_Table[i],28 - Shift_Table[i]);
        memcpy(szCi + 28 - Shift_Table[i],szTmpL,Shift_Table[i]);
        //Right 28 bits
        memcpy(szDi,szTmpR + Shift_Table[i],28 - Shift_Table[i]);
        memcpy(szDi + 28 - Shift_Table[i],szTmpR,Shift_Table[i]);

        //permuted choice 48 bits key
        memcpy(szTmp56,szCi,28);
        memcpy(szTmp56 + 28,szDi,28);
        for(j=0;j<48;j++)
            szSubKeys[i][j] = szTmp56[PC2_Table[j]-1];
        //Evaluate new szTmpL and szTmpR
        memcpy(szTmpL,szCi,28);
        memcpy(szTmpR,szDi,28);
    }
}

void DES_InitializeKey(char* srcBytes)
{
    //convert 8 char-bytes key to 64 binary-bits
    char sz_64key[64] = {0};
    char sz_56key[56] = {0};
    int k=0;
    DES_Bytes2Bits(srcBytes,sz_64key,64);
    //PC 1
    for(k=0;k<56;k++)
        sz_56key[k] = sz_64key[PC1_Table[k]-1];
    DES_CreateSubKey(sz_56key);
}

void DES_InitialPermuteData(char* _src,char* _dst)
{
    //IP
    int i=0;
    for(i=0;i<64;i++)
        _dst[i] = _src[IP_Table[i]-1];
}

void DES_ExpansionR(char* _src,char* _dst)
{
    int i=0;
    for(i=0;i<48;i++)
        _dst[i] = _src[E_Table[i]-1];
}

void DES_XOR(char* szParam1,char* szParam2, unsigned int uiParamLength, char* szReturnValueBuffer)
{
    unsigned int i=0;
    for(i=0; i<uiParamLength; i++)
        szReturnValueBuffer[i] = szParam1[i] ^ szParam2[i];
}

void DES_Int2Bits(unsigned int _src, char* dstBits)
{
    unsigned int i=0;
    for(i=0; i < 4; i++)
        dstBits[i] = ((_src<<i) & 8)>>3;
}

void DES_CompressFuncS(char* _src48, char* _dst32)
{
    char bTemp[8][6]={0};
    char dstBits[4]={0};
    int i=0,iX=0,iY=0,j=0;

    for(i=0;i<8;i++)
    {
        memcpy(bTemp[i],_src48+i*6,6);
        iX = (bTemp[i][0])*2 + (bTemp[i][5]);
        iY = 0;
        for(j=1;j<5;j++)
            iY += bTemp[i][j]<<(4-j);
        DES_Int2Bits(S_Box[i][iX][iY], dstBits);
        memcpy(_dst32 + i * 4, dstBits, 4);
    }
}

void DES_PermutationP(char* _src,char* _dst)
{
    int i=0;
    for(i=0;i<32;i++)
        _dst[i] = _src[P_Table[i]-1];
}

void DES_FunctionF(char* sz_Li,char* sz_Ri,unsigned int iKey)
{
    char sz_48R[48] = {0};
    char sz_xor48[48] = {0};
    char sz_P32[32] = {0};
    char sz_Rii[32] = {0};
    char sz_Key[48] = {0};
    char s_Compress32[32] = {0};
    memcpy(sz_Key,szSubKeys[iKey],48);
    DES_ExpansionR(sz_Ri,sz_48R);
    DES_XOR(sz_48R,sz_Key,48,sz_xor48);
    DES_CompressFuncS(sz_xor48,s_Compress32);
    DES_PermutationP(s_Compress32,sz_P32);
    DES_XOR(sz_P32,sz_Li,32,sz_Rii);
    memcpy(sz_Li,sz_Ri,32);
    memcpy(sz_Ri,sz_Rii,32);
}

void DES_Bits2Bytes(char *dstBytes, char* srcBits, unsigned int sizeBits)
{
    unsigned int i=0;
    memset(dstBytes,0,sizeBits>>3);
    for(i=0; i < sizeBits; i++)
        dstBytes[i>>3] |= (srcBits[i] << (7 - (i & 7)));
}

void DES_EncryptData(char* _srcBytes)
{
    char szSrcBits[64] = {0};
    char sz_IP[64] = {0};
    char sz_Li[32] = {0};
    char sz_Ri[32] = {0};
    char sz_Final64[64] = {0};
    int i=0,j=0;

    DES_Bytes2Bits(_srcBytes,szSrcBits,64);
    //IP
    DES_InitialPermuteData(szSrcBits,sz_IP);
    memcpy(sz_Li,sz_IP,32);
    memcpy(sz_Ri,sz_IP + 32,32);

    for(i=0;i<16;i++)
        DES_FunctionF(sz_Li,sz_Ri,i);
    //so D=LR

    memcpy(sz_Final64,sz_Ri,32);
    memcpy(sz_Final64 + 32,sz_Li,32);

    //~IP
    for(j=0;j<64;j++)
        szCiphertextRaw[j] = sz_Final64[IPR_Table[j]-1];
    DES_Bits2Bytes(szCiphertextInBytes,szCiphertextRaw,64);
}

void des_deal(int idx,char c)
{
    srcBytes[7]=c;
    memcpy(szLast8Bits,srcBytes,8); //+ ((counter%64/8-1)<<3)
    DES_EncryptData(szLast8Bits);
    for(int i=0;i<8;i++)
        base64_func[(n++)%3](szCiphertextInBytes[i]);
}

void des_store(int idx,char c)
{
    srcBytes[idx]=c;
}

void (*des_func[])(int idx,char c)={
    des_store,des_deal
};

void des_adpter(char c)
{
    int idx=(counter++)%8;
    des_func[counter%8==0](idx,c);
}

BYTE m_MaxBits = 9;
int m_TotalBits = 0;
DWORD m_SavedData = 0;
struct dicElement
{
    DWORD   m_Prefix;       //  keep the prefix of the element
    BYTE    m_Letter;       //  keep the letter of the element

    dicElement()
    {
        m_Prefix = 0;
        m_Letter = 0;
    }
};
void GetBytesFromCode(CPtrArray *m_dictionary,CByteArray *Buffer, DWORD code)
{
    //  Fill an array with bytes using the code for retrieving 
    //  those bytes from the dictionary elements

    //  Since we dont have 0-255 in the dictionary we have to make 
    //  sure, that if we get below 256 we stop (but still add that code)
    //  Every code higher then 255, will have a letter attached to it,
    //  which we use for getting the string back.

    while (code > 255)
    {
        dicElement *tmpEl = (dicElement*)m_dictionary->GetAt(code - 256);
        Buffer->Add(tmpEl->m_Letter);
        code = tmpEl->m_Prefix;
    }
    Buffer->Add((BYTE)code);
}

void CompressData(DWORD toSave)
{
    //  Move the data you want to write few bits to the left
    //  and combine it with the already existing data in the buffer
    m_SavedData |= toSave << (32 - m_MaxBits - m_TotalBits);
    //  Add the new added number of bits to the total bits counter
    m_TotalBits += m_MaxBits;
    //  Check if it's possible to enter the data to the file
    //  (over and equal a byte of data)
    while (m_TotalBits >= 8)
    {
        //  Get the byte we want to write
        DWORD writeData = m_SavedData;
        writeData >>= 24;
        des_adpter(writeData);
        //  remove the byte from the buffer
        m_SavedData <<= 8;
        //  Remove the byte from the counter
        m_TotalBits -= 8;
    }
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // initialize MFC and print and error on failure
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: change error code to suit your needs
        cerr << _T("Fatal Error: MFC initialization failed") << endl;
        nRetCode = 1;
    }
    else
    {
        if (IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(NULL)) //CF_UNICODETEXT
        {
            HGLOBAL hMem = GetClipboardData(CF_TEXT); 
            if (hMem != NULL) 
            {
                LPTSTR lpStr = (LPTSTR)GlobalLock(hMem); 
                if (lpStr != NULL)
                    GlobalUnlock(hMem);
                DES_InitializeKey("dsdfgsff");
                DWORD m_MaxCode[32]={0,0x1,0x3,0x7,0xF,0x1F,0x3F,0x7F,0xFF,0x1FF,0x3FF,0x7FF,0xFFF,0x1FFF,0x3FFF,0x7FFF,0xFFFF,0x1FFFF,0x3FFFF,0x7FFFF,0xFFFFF,0x1FFFFF,0x3FFFFF,0x7FFFFF,0xFFFFFF,0x1FFFFFF,0x3FFFFFF,0x7FFFFFF,0xFFFFFFF,0x1FFFFFFF,0x3FFFFFFF,0x7FFFFFFF};
                CPtrArray *m_dictionary= new CPtrArray;
                long result = 0;
                BYTE readByte = 0;
                DWORD resAdd = 256;
                //  Get the total file size
                DWORD prefix=*lpStr++;
                //  Go over the rest of the file and read it
                while (readByte=*lpStr++)
                {
                    //  Check if the prefix and readByte combination exist in the dictionary
                    //  Returns the code of an element from the dictionary
                    //  by searching for the prefix and letter assosiated with
                    //  that element code.
                    //  Returns -1 if no entry was found
                    int total = m_dictionary->GetSize();
                    dicElement *temp = NULL;
                    for (int counter = 0; counter < total; counter++)
                    {
                        temp = (dicElement*)m_dictionary->GetAt(counter);
                        if ((temp->m_Prefix == prefix) && 
                            (temp->m_Letter == readByte))
                            break;
                        temp = NULL;
                    }
                    if (temp != NULL)
                        result =counter + 256;
                    else
                        result =-1;
                    //  If not exist
                    if (result == -1)
                    {
                        //  Add the new combination
                        //  Add a dictionary element.
                        //  Since the dictionary should already have all the values
                        //  between 0-255, we start it from 256.
                        dicElement *temp = new dicElement;
                        temp->m_Prefix = prefix;
                        temp->m_Letter = readByte;
                        m_dictionary->Add(temp);
                        resAdd = m_dictionary->GetSize() + 255;
                        //  Calculate the new bit size needed to encode the file
                        //  Check the value of the parameter against the Maximum number possible
                        //  and then returns the counter
                        //  This can also be acheived by right shifting the value until we get 0
                        //  and counting the number of times we doing it.
                        for (BYTE counter = 0; counter < 32; counter++)
                            if (resAdd <= m_MaxCode[counter])
                                break;
                        m_MaxBits = counter;
                        //  Since the minimal number of bits we are using is 9 (256 is the begining of the dictionary), 
                        //  then the minimal number of bits is check to return a 9 in case a lower value will be
                        //  reached in the application
                        if (m_MaxBits < 9)
                            m_MaxBits = 9;  
                        //  Send the prefix for compression in to the destination file
                        CompressData(prefix);
                        //  Set the prefix as the readByte
                        prefix = readByte;
                        //  Initiate the result
                        result = -1;
                        delete temp;
                    }
                    else
                    {
                        //  Set the prefix as the result
                        prefix = result;
                        readByte = 0;
                    }
                }
                //  Insert to the file the maximum number of bit (for signaling the end of the
                //  compression\decompression)
                CompressData(prefix);
                CompressData(m_MaxCode[m_MaxBits]);
                //  Flash the rest of the file with 0
                CompressData(0);
                int iParts=0,iResidue=0,i=0;
                char szLast8Bits[8] = {0};
                if(counter<8)
                {
                    char _temp8bytes[8] = {0};
                    memcpy(_temp8bytes,srcBytes,counter);
                    DES_EncryptData(_temp8bytes);
                    for(int i=0;i<8;i++)
                        base64_func[(n++)%3](szCiphertextInBytes[i]);
                }
                else if(counter>8)
                {
                    iResidue = counter % 8;
                    if(iResidue>0)
                        for(int i=0;i<iResidue;i++)
                            base64_func[(n++)%3](srcBytes[i]);
                }
                switch(n % 3)
                {
                case 1:
                    strEncode+= EncodeTable[(Tmp1 & 0xFC) >> 2];
                    strEncode+= EncodeTable[((Tmp1 & 0x03) << 4)];
                    strEncode+= "==";
                    break;
                case 2:
                    strEncode+= EncodeTable[(Tmp1 & 0xFC) >> 2];
                    strEncode+= EncodeTable[((Tmp1 & 0x03) << 4) | ((Tmp2 & 0xF0) >> 4)];
                    strEncode+= EncodeTable[((Tmp2 & 0x0F) << 2)];
                    strEncode+= "=";
                    break;
                }
                //  Remove the existing dictionary
                delete m_dictionary;
                char *pMem;
                hMem = GlobalAlloc( GHND | GMEM_DDESHARE, strEncode.length()+1);
                if(hMem)
                {
                    pMem = (char*)GlobalLock(hMem);
                    strcpy(pMem,strEncode.c_str());
                    GlobalUnlock(hMem);
                    EmptyClipboard();
                    SetClipboardData(CF_TEXT,hMem);
                }
                CloseClipboard();
            }
        }
    }

    return nRetCode;
}

decodeDESstr.cpp

// decodeDESstr.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "decodeDESstr.h"
#include <string.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;
void decompress_adpter(BYTE b);
DWORD m_MaxCode[32]={0,0x1,0x3,0x7,0xF,0x1F,0x3F,0x7F,0xFF,0x1FF,0x3FF,0x7FF,0xFFF,0x1FFF,0x3FFF,0x7FFF,0xFFFF,0x1FFFF,0x3FFFF,0x7FFFF,0xFFFFF,0x1FFFFF,0x3FFFFF,0x7FFFFF,0xFFFFFF,0x1FFFFFF,0x3FFFFFF,0x7FFFFFF,0xFFFFFFF,0x1FFFFFFF,0x3FFFFFFF,0x7FFFFFFF};
BYTE m_MaxBits= 9;
int m_TotalBits= 0;
DWORD m_SavedData= 0;
DWORD data = 0;
CByteArray decodeString;
BYTE writeData = 0, character = 0;
long counter = 0;
//  Get the first prefix information
DWORD prefix;
int idx=0;
CPtrArray *m_dictionary;
string strDecode;
struct dicElement
{
    DWORD   m_Prefix;       //  keep the prefix of the element
    BYTE    m_Letter;       //  keep the letter of the element

    dicElement()
    {
        m_Prefix = 0;
        m_Letter = 0;
    }
};

void GetBytesFromCode(CPtrArray *m_dictionary,CByteArray *Buffer, DWORD code)
{
    //  Fill an array with bytes using the code for retrieving 
    //  those bytes from the dictionary elements

    //  Since we dont have 0-255 in the dictionary we have to make 
    //  sure, that if we get below 256 we stop (but still add that code)
    //  Every code higher then 255, will have a letter attached to it,
    //  which we use for getting the string back.
    dicElement *tmpEl = NULL;

    while (code > 255)
    {
        tmpEl = (dicElement*)m_dictionary->GetAt(code - 256);
        Buffer->Add(tmpEl->m_Letter);
        code = tmpEl->m_Prefix;
    }
    Buffer->Add((BYTE)code);
}

void getbyte(BYTE b)
{   
    //  Add the byte to the read buffer
    m_SavedData |= (DWORD) b << (24 - m_TotalBits);
    //  Add byte to the bit counter
    m_TotalBits += 8;
}

void initial(BYTE b)
{
    idx=1;
    //  calculate the return information
    prefix = m_SavedData >> (32 - m_MaxBits);
    //  Remove the returned information from the buffer
    m_SavedData <<= m_MaxBits;
    //  Remove the return information bit size from the bit counter
    m_TotalBits -= m_MaxBits;
    //  Save the prefix as the last used character (since we're writing it in the
    //  destination file)
    character = (BYTE)prefix;
    //  Write the prefix in the destination file (the first byte inside
    //  a LZW copressed file is always the first byte of the original file)
    strDecode+=prefix;
    decompress_adpter(b);
}

void rest2(BYTE b)
{
    //  calculate the return information
    data = m_SavedData >> (32 - m_MaxBits);
    //  Remove the returned information from the buffer
    m_SavedData <<= m_MaxBits;
    //  Remove the return information bit size from the bit counter
    m_TotalBits -= m_MaxBits;

    if (data != m_MaxCode[m_MaxBits])
    {
        //  Check if the code exist in the dictionary
        //  if not
        //  Check if the code exist in the dictionary
        //  Returns TRUE if so, and FALSE if not.

        //  If the code is lower then 256, then the element is a normal
        //  ASCII character, and as such is considered to be in the
        //  dictionay.
        if (data >= 256 && data - 256 >= (unsigned)m_dictionary->GetSize())
        {
            //  Get the last used character into the decod buffer
            decodeString.Add((BYTE)character);
            //  Decode the existing prefix into a known string of data
            GetBytesFromCode(m_dictionary,&decodeString, prefix);
        }
        else
        {
            //  Decode the data into the decode buffer
            GetBytesFromCode(m_dictionary,&decodeString, data);
            //  Get the last letter inside the data, as the last used letter
            character = decodeString.GetAt(decodeString.GetSize() - 1);
        }

        //  Go over the decode buffer, from the end to the start,
        //  and write the information into the destination file
        counter = decodeString.GetSize();
        while (counter > 0)
        {
            writeData = (BYTE)decodeString.GetAt(--counter);
            strDecode+=writeData;
        }

        //  Clear the decode buffer
        decodeString.RemoveAll();
        //  Add the new combination into the dictionary
        //  Add a dictionary element.
        //  Since the dictionary should already have all the values
        //  between 0-255, we start it from 256.
        dicElement *tmp = new dicElement;

        tmp->m_Prefix = prefix;
        tmp->m_Letter = (BYTE)character;

        m_dictionary->Add(tmp);

        //  Calculate the new buffer size to read now
        DWORD value=m_dictionary->GetSize() + 257;
        //  Check the value of the parameter against the Maximum number possible
        //  and then returns the counter

        //  This can also be acheived by right shifting the value until we get 0
        //  and counting the number of times we doing it.

        for (BYTE counter = 0; counter < 32; counter++)
            if (value <= m_MaxCode[counter])
                break;
        m_MaxBits = counter;

        //  Since the minimal number of bits we are using is 9 (256 is the begining of the dictionary), 
        //  then the minimal number of bits is check to return a 9 in case a lower value will be
        //  reached in the application
        if (m_MaxBits < 9)
            m_MaxBits = 9;              
        //  Set the new prefix to use
        prefix = data;
        delete tmp;
    }
}

void (*rest_func[])(BYTE b)={
    getbyte,rest2
};

void rest(BYTE b)
{
    rest_func[m_TotalBits > 24](b);
    decompress_adpter(b);
}

void (*getrestbytes[])(BYTE b)={
    initial,rest
};

void getotherbytes(BYTE b)
{
    getrestbytes[idx](b);
}

void (*decompress_func[])(BYTE b)={
    getbyte,getotherbytes
};

void decompress_adpter(BYTE b)
{
    decompress_func[m_TotalBits > 24](b);
}

long count=0;
char srcBytes[8]={0};
char szLast8Bits[8] = {0};
char szSubKeys[16][48];//储存16组48位密钥
char szCiphertextRaw[64]; //储存二进制密文(64个Bits) int 0,1
char szPlaintextRaw[64]; //储存二进制密文(64个Bits) int 0,1
char szCiphertextInBytes[8];//储存8位密文
char szPlaintextInBytes[8];//储存8位明文字符串
char szPlaintext[9];//储存8位明文字符串,最后一位存'\0'

// permuted choice table (PC1)
const static char PC1_Table[56] = {
    57, 49, 41, 33, 25, 17,  9,  1, 58, 50, 42, 34, 26, 18,
        10,  2, 59, 51, 43, 35, 27, 19, 11,  3, 60, 52, 44, 36,
        63, 55, 47, 39, 31, 23, 15,  7, 62, 54, 46, 38, 30, 22,
        14,  6, 61, 53, 45, 37, 29, 21, 13,  5, 28, 20, 12,  4
};
// permuted choice key (PC2)
const static char PC2_Table[48] = {
    14, 17, 11, 24,  1,  5,  3, 28, 15,  6, 21, 10,
        23, 19, 12,  4, 26,  8, 16,  7, 27, 20, 13,  2,
        41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
        44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
};
// number left rotations of pc1 
const static char Shift_Table[16] = {
    1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
};
// initial permutation (IP)
const static char IP_Table[64] = {
    58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
        62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
        57, 49, 41, 33, 25, 17,  9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
        61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
};
// expansion operation matrix (E)
const static char E_Table[48] = {
    32,  1,  2,  3,  4,  5,  4,  5,  6,  7,  8,  9,
        8,  9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
        16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,
        24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32,  1
};
// The (in)famous S-boxes 
const static char S_Box[8][4][16] = {
    // S1
    14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
        0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
        4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
        15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13,
        // S2 
        15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
        3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
        0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
        13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9,
        // S3 
        10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
        13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
        13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
        1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12,
        // S4 
        7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
        13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
        10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
        3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14,
        // S5 
        2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
        14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
        4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
        11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3,
        // S6 
        12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
        10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
        9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
        4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13,
        // S7 
        4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
        13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
        1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
        6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12,
        // S8 
        13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
        1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
        7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
        2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11
};
// 32-bit permutation function P used on the output of the S-boxes 
const static char P_Table[32] = {
    16, 7, 20, 21, 29, 12, 28, 17, 1,  15, 23, 26, 5,  18, 31, 10,
        2,  8, 24, 14, 32, 27, 3,  9,  19, 13, 30, 6,  22, 11, 4,  25
};
// final permutation IP^-1 
const static char IPR_Table[64] = {
    40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,
        38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,
        36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,
        34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41,  9, 49, 17, 57, 25
};

void DES_CreateSubKey(char* sz_56key)
{
    char szTmpL[28] = {0};
    char szTmpR[28] = {0};
    char szCi[28] = {0};
    char szDi[28] = {0};
    char szTmp56[56] = {0};
    int i=0,j=0;

    memcpy(szTmpL,sz_56key,28);
    memcpy(szTmpR,sz_56key + 28,28);

    for(i=0;i<16;i++)
    {
        //shift to left
        //Left 28 bits
        memcpy(szCi,szTmpL + Shift_Table[i],28 - Shift_Table[i]);
        memcpy(szCi + 28 - Shift_Table[i],szTmpL,Shift_Table[i]);
        //Right 28 bits
        memcpy(szDi,szTmpR + Shift_Table[i],28 - Shift_Table[i]);
        memcpy(szDi + 28 - Shift_Table[i],szTmpR,Shift_Table[i]);

        //permuted choice 48 bits key
        memcpy(szTmp56,szCi,28);
        memcpy(szTmp56 + 28,szDi,28);
        for(j=0;j<48;j++)
            szSubKeys[i][j] = szTmp56[PC2_Table[j]-1];
        //Evaluate new szTmpL and szTmpR
        memcpy(szTmpL,szCi,28);
        memcpy(szTmpR,szDi,28);
    }
}

void DES_Bytes2Bits(char *srcBytes, char* dstBits, unsigned int sizeBits)
{
    unsigned int i=0;
    for(i=0; i < sizeBits; i++)
        dstBits[i] = ((srcBytes[i>>3]<<(i&7)) & 128)>>7;
}

void DES_InitializeKey(char* srcBytes)
{
    //convert 8 char-bytes key to 64 binary-bits
    char sz_64key[64] = {0};
    char sz_56key[56] = {0};
    int k=0;
    DES_Bytes2Bits(srcBytes,sz_64key,64);
    //PC 1
    for(k=0;k<56;k++)
        sz_56key[k] = sz_64key[PC1_Table[k]-1];
    DES_CreateSubKey(sz_56key);
}

void DES_InitialPermuteData(char* _src,char* _dst)
{
    //IP
    int i=0;
    for(i=0;i<64;i++)
        _dst[i] = _src[IP_Table[i]-1];
}

void DES_XOR(char* szParam1,char* szParam2, unsigned int uiParamLength, char* szReturnValueBuffer)
{
    unsigned int i=0;
    for(i=0; i<uiParamLength; i++)
        szReturnValueBuffer[i] = szParam1[i] ^ szParam2[i];
}

void DES_ExpansionR(char* _src,char* _dst)
{
    int i=0;
    for(i=0;i<48;i++)
        _dst[i] = _src[E_Table[i]-1];
}

void DES_Int2Bits(unsigned int _src, char* dstBits)
{
    unsigned int i=0;
    for(i=0; i < 4; i++)
        dstBits[i] = ((_src<<i) & 8)>>3;
}

void DES_CompressFuncS(char* _src48, char* _dst32)
{
    char bTemp[8][6]={0};
    char dstBits[4]={0};
    int i=0,iX=0,iY=0,j=0;

    for(i=0;i<8;i++)
    {
        memcpy(bTemp[i],_src48+i*6,6);
        iX = (bTemp[i][0])*2 + (bTemp[i][5]);
        iY = 0;
        for(j=1;j<5;j++)
            iY += bTemp[i][j]<<(4-j);
        DES_Int2Bits(S_Box[i][iX][iY], dstBits);
        memcpy(_dst32 + i * 4, dstBits, 4);
    }

}

void DES_PermutationP(char* _src,char* _dst)
{
    int i=0;
    for(i=0;i<32;i++)
        _dst[i] = _src[P_Table[i]-1];
}

void DES_FunctionF(char* sz_Li,char* sz_Ri,unsigned int iKey)
{
    char sz_48R[48] = {0};
    char sz_xor48[48] = {0};
    char sz_P32[32] = {0};
    char sz_Rii[32] = {0};
    char sz_Key[48] = {0};
    char s_Compress32[32] = {0};
    memcpy(sz_Key,szSubKeys[iKey],48);
    DES_ExpansionR(sz_Ri,sz_48R);
    DES_XOR(sz_48R,sz_Key,48,sz_xor48);

    DES_CompressFuncS(sz_xor48,s_Compress32);
    DES_PermutationP(s_Compress32,sz_P32);
    DES_XOR(sz_P32,sz_Li,32,sz_Rii);
    memcpy(sz_Li,sz_Ri,32);
    memcpy(sz_Ri,sz_Rii,32);
}

void DES_Bits2Bytes(char *dstBytes, char* srcBits, unsigned int sizeBits)
{
    unsigned int i=0;
    memset(dstBytes,0,sizeBits>>3);
    for(i=0; i < sizeBits; i++)
        dstBytes[i>>3] |= (srcBits[i] << (7 - (i & 7)));
}

void DES_DecryptData(char* _srcBytes)
{
    char szSrcBits[64] = {0};
    char sz_IP[64] = {0};
    char sz_Li[32] = {0};
    char sz_Ri[32] = {0};
    char sz_Final64[64] = {0};
    int i=0,j=0;
    DES_Bytes2Bits(_srcBytes,szSrcBits,64);
    //IP --- return is sz_IP
    DES_InitialPermuteData(szSrcBits,sz_IP);
    //divide the 64 bits data to two parts
    memcpy(sz_Ri,sz_IP,32); //exchange L to R
    memcpy(sz_Li,sz_IP + 32,32);  //exchange R to L
    //16 rounds F and xor and exchange
    for(i=0;i<16;i++)
        DES_FunctionF(sz_Ri,sz_Li,15-i);
    memcpy(sz_Final64,sz_Li,32);
    memcpy(sz_Final64 + 32,sz_Ri,32);
    // ~IP
    for(j=0;j<64;j++)
        szPlaintextRaw[j] = sz_Final64[IPR_Table[j]-1];
    DES_Bits2Bytes(szPlaintextInBytes,szPlaintextRaw,64);
}

void inv_des_deal(int idx,char c)
{
    srcBytes[7]=c;
    memcpy(szLast8Bits,srcBytes,8);
    DES_DecryptData(szLast8Bits);
    for(int ii=0;ii<8;ii++)
        decompress_adpter(szPlaintextInBytes[ii]);
}

void inv_des_store(int idx,char c)
{
    srcBytes[idx]=c;
}

void (*inv_des_func[])(int idx,char c)={
    inv_des_store,inv_des_deal
};

void inv_des_adpter(char c)
{
    int idx=(count++)%8;
    inv_des_func[count%8==0](idx,c);
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // initialize MFC and print and error on failure
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: change error code to suit your needs
        cerr << _T("Fatal Error: MFC initialization failed") << endl;
        nRetCode = 1;
    }
    else
    {
        if (IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(NULL)) //CF_UNICODETEXT
        {
            HGLOBAL hMem = GetClipboardData(CF_TEXT); 
            if (hMem != NULL) 
            {
                LPTSTR lpStr = (LPTSTR)GlobalLock(hMem); 
                if (lpStr != NULL)
                    GlobalUnlock(hMem);
                DES_InitializeKey("dsdfgsff");
                TCHAR* Data=lpStr;
                int DataByte=strlen(lpStr);
                m_dictionary= new CPtrArray;
                //解码表
                TCHAR DecodeTable[] =
                {
                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        62, // '+'
                        0, 0, 0,
                        63, // '/'
                        52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9'
                        0, 0, 0, 0, 0, 0, 0,
                        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
                        13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 'A'-'Z'
                        0, 0, 0, 0, 0, 0,
                        26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
                        39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // 'a'-'z'
                };
                int nValue;
                int i= 0;
                while (i < DataByte)
                {
                    if (*Data != '\r' && *Data!='\n')
                    {
                        nValue = DecodeTable[*Data++] << 18;
                        nValue += DecodeTable[*Data++] << 12;
                        inv_des_adpter((nValue & 0x00FF0000) >> 16);
                        if (*Data != '=')
                        {
                            nValue += DecodeTable[*Data++] << 6;
                            inv_des_adpter((nValue & 0x0000FF00) >> 8);
                            if (*Data != '=')
                            {
                                nValue += DecodeTable[*Data++];
                                inv_des_adpter(nValue & 0x000000FF);
                            }
                        }
                        i += 4;
                    }
                    else// 回车换行,跳过
                    {
                        Data++;
                        i++;
                    }
                }
                char szLast8Bits[8] = {0};
                char _temp8bytes[8] = {0};
                if(count<8)
                {
                    memcpy(_temp8bytes,srcBytes,8);
                    DES_DecryptData(_temp8bytes);
                    for(int ii=0;ii<8;ii++)
                        decompress_adpter(szPlaintextInBytes[ii]);
                }
                else if(count>8)
                {
                    int iResidue = count % 8;
                    if(iResidue>0)
                        for(int ii=0;ii<iResidue;ii++)
                            decompress_adpter(srcBytes[ii]);
                }
                for(data=(m_SavedData == 0 && m_TotalBits == 0)?m_MaxCode[m_MaxBits]:m_SavedData >> (32 - m_MaxBits),m_SavedData <<= m_MaxBits,m_TotalBits -= m_MaxBits;
                data != m_MaxCode[m_MaxBits];
                data=(m_SavedData == 0 && m_TotalBits == 0)?m_MaxCode[m_MaxBits]:m_SavedData >> (32 - m_MaxBits),m_SavedData <<= m_MaxBits,m_TotalBits -= m_MaxBits)
                {
                    //  Check if the code exist in the dictionary
                    //  if not
                    //  Check if the code exist in the dictionary
                    //  Returns TRUE if so, and FALSE if not.

                    //  If the code is lower then 256, then the element is a normal
                    //  ASCII character, and as such is considered to be in the
                    //  dictionay.
                    if (data >= 256 && data - 256 >= (unsigned)m_dictionary->GetSize())
                    {
                        //  Get the last used character into the decod buffer
                        decodeString.Add((BYTE)character);
                        //  Decode the existing prefix into a known string of data
                        GetBytesFromCode(m_dictionary,&decodeString, prefix);
                    }
                    else
                    {
                        //  Decode the data into the decode buffer
                        GetBytesFromCode(m_dictionary,&decodeString, data);
                        //  Get the last letter inside the data, as the last used letter
                        character = decodeString.GetAt(decodeString.GetSize() - 1);
                    }

                    //  Go over the decode buffer, from the end to the start,
                    //  and write the information into the destination file
                    counter = decodeString.GetSize();
                    while (counter > 0)
                    {
                        writeData = (BYTE)decodeString.GetAt(--counter);
                        strDecode+=writeData;
                    }

                    //  Clear the decode buffer
                    decodeString.RemoveAll();
                    //  Add the new combination into the dictionary
                    //  Add a dictionary element.
                    //  Since the dictionary should already have all the values
                    //  between 0-255, we start it from 256.
                    dicElement *tmp = new dicElement;

                    tmp->m_Prefix = prefix;
                    tmp->m_Letter = (BYTE)character;

                    m_dictionary->Add(tmp);

                    //  Calculate the new buffer size to read now
                    DWORD value=m_dictionary->GetSize() + 257;
                    //  Check the value of the parameter against the Maximum number possible
                    //  and then returns the counter

                    //  This can also be acheived by right shifting the value until we get 0
                    //  and counting the number of times we doing it.

                    for (BYTE counter = 0; counter < 32; counter++)
                        if (value <= m_MaxCode[counter])
                            break;
                    m_MaxBits = counter;

                    //  Since the minimal number of bits we are using is 9 (256 is the begining of the dictionary), 
                    //  then the minimal number of bits is check to return a 9 in case a lower value will be
                    //  reached in the application
                    if (m_MaxBits < 9)
                        m_MaxBits = 9;              
                    //  Set the new prefix to use
                    prefix = data;
                    delete tmp;
                }
                delete m_dictionary;
                char *pMem;
                hMem = GlobalAlloc( GHND | GMEM_DDESHARE, strDecode.length()+1);
                if(hMem)
                {
                    pMem = (char*)GlobalLock(hMem);
                    strcpy(pMem,strDecode.c_str());
                    GlobalUnlock(hMem);
                    EmptyClipboard();
                    SetClipboardData(CF_TEXT,hMem);
                }
                CloseClipboard();
            }
        }
    }

    return nRetCode;
}

测试文本

2

标签:c++

收藏

0人收藏

支持

0

反对

0

»更多 您可能感兴趣的代码
  1. 2017-07-23 12:42:20奇数魔方阵 by Kevin.
  2. 2017-07-18 14:15:24两种方法计算“算术表达式” by aiheng1988
  3. 2015-09-09 16:29:06将jpg转换为bmp格式的文件 by qqmmcc
  4. 2015-09-09 09:29:49可执行文件加密 by walker30
  5. 2015-09-08 18:42:46TCP端口占用查询 by 灵剑子
  6. 2015-09-08 14:16:34Luffar schack五子棋 by 蟋蟀哥
  7. 2015-09-08 10:39:34wav转mp3的程序 by 灵剑子
  8. 2015-09-05 16:54:59逐行搜索目录中的文件内容并输出到Excel by 蟋蟀哥
  9. 2015-09-03 20:10:15LZW+AES+Base64编码解码剪贴板文本 by 童学芬
  10. 2015-09-01 17:47:21猫里奥 by aiheng1988
  11. 2015-08-31 15:33:59模拟键盘操作发送字符串 by 千万不要郁闷

发表评论