1. 程式人生 > >DELPHI、PHP、C#通用DES編碼解碼單元 (DELPHI下使用的程式碼)

DELPHI、PHP、C#通用DES編碼解碼單元 (DELPHI下使用的程式碼)

unit uDES;
{*********************************************************}
{*          DELPHI、PHP、C#通用DES編碼解碼單元           *}
{*       blessed  2016-10-18       *}
{*********************************************************}
{EncryStr為編碼函式,DecryStr為解碼函式,Key為密碼,pvIV為偏移量,
一般設定Key,pvIV相同,內容為八位位元組長度的字串,編碼結果為十六進位制字串}
interface
uses
   Windows, Classes, SysUtils,Dialogs,Base64;
type
   fdArray   = array of dword;
    /// <summary>
    /// DES加密返回BASE64後的資料
    /// </summary>
    /// <param name="Str"></param>
    /// <param name="Key"></param>
    /// <param name="pvIV"></param>
    /// <returns></returns>
   function EncryStr(Str, Key: String;pvIV:string): String;
   /// <summary>
   /// DES解密
   /// </summary>
   /// <param name="Str"></param>
   /// <param name="Key"></param>
   /// <param name="pvIV"></param>
   /// <returns></returns>
   function DecryStr(Str, Key: String;pvIV:string): String;
   /// <summary>
   /// DES加密返回16進位制的資料
   /// </summary>
   /// <param name="Str"></param>
   /// <param name="Key"></param>
   /// <param name="pvIV"></param>
   /// <returns></returns>
   function EncryStrHex(Str, Key: String;pvIV:string): String;
   /// <summary>
   /// DES解密
   /// </summary>
   /// <param name="Str"></param>
   /// <param name="Key"></param>
   /// <param name="pvIV"></param>
   /// <returns></returns>
   function DecryStrHex(Str, Key: String;pvIV:string): String;
   function des(key:string;smessage:string;encrypt:dword;mode:dword;iv:string):string;
   function des_createKeys(key:string):fdArray;
   function StrToHex(Str:string):string;
   function HexToStr(Hex:string):string;
   function IsInt(Str:String):Boolean;
implementation
function EncryStr(Str, Key: String;pvIV:string): String;


var i:integer;
  str1:string;
  Astr:string;
  vi:array [0..7] of Byte;
begin
   for i:=0 to 7 do begin
     if i > (length(pvIV)-1) then
      vi[i]:=0
    else
      vi[i] := byte(pvIV[i+1]);
   end;
   for i := 0 to 7 do
    begin
     str1 :=str1 + Chr(vi[i]);
    end;
 Result :=Base64EncodeStr(des(Key, Str, 1, 1, str1));
end;
 
function DecryStr(Str, Key: String;pvIV:string): String;
var i:integer;
   vistr:string;
   vi:array [0..7] of Byte;
begin
   for i:=0 to 7 do begin
     if i > (length(pvIV)-1) then
      vi[i]:=0
    else
      vi[i] := byte(pvIV[i+1]);
   end;
   for i := 0 to 7 do
    begin
     vistr :=vistr + Chr(vi[i]);
    end;
   Result := trim(des(Key, Str, 0, 0, vistr));
end;


function EncryStrHex(Str, Key: String ;pvIV:string): String;


var i:integer;
  vistr:string;
   vi:array [0..7] of Byte;
begin
   for i:=0 to 7 do begin
     if i > (length(pvIV)-1) then
      vi[i]:=0
    else
      vi[i] := byte(pvIV[i+1]);
   end;
   for i := 0 to 7 do
    begin
     vistr :=vistr + Chr(vi[i]);
    end;
   Result := trim(StrToHex(des(Key,Str, 1,1, vistr)));  {1:加密1:CBC }
end;


function DecryStrHex(Str, Key: String;pvIV:string): String;
var i:integer;
   vistr:string;
   vi:array [0..7] of Byte;
begin
   for i:=0 to 7 do begin
     if i > (length(pvIV)-1) then
      vi[i]:=0
    else
      vi[i] := byte(pvIV[i+1]);
   end;
   for i := 0 to 7 do
    begin
     vistr :=vistr + Chr(vi[i]);
    end;
   Result := trim(des(Key, HexToStr(Str), 0, 1, vistr ));
end;


function des(key:string;smessage:string;encrypt:dword;mode:dword;iv:string):string;
const
   spfunction1 : array[0..63] of dword = ($1010400,0,$10000,$1010404,$1010004,$10404,$4,$10000,$400,$1010400,$1010404,$400,$1000404,$1010004,$1000000,$4,$404,$1000400,$1000400,$10400,$10400,$1010000,$1010000,$1000404,$10004,$1000004,$1000004,$10004,0,$404,$10404,$1000000,$10000,$1010404,$4,$1010000,$1010400,$1000000,$1000000,$400,$1010004,$10000,$10400,$1000004,$400,$4,$1000404,$10404,$1010404,$10004,$1010000,$1000404,$1000004,$404,$10404,$1010400,$404,$1000400,$1000400,0,$10004,$10400,0,$1010004);
   spfunction2 : array[0..63] of dword = ($80108020,$80008000,$8000,$108020,$100000,$20,$80100020,$80008020,$80000020,$80108020,$80108000,$80000000,$80008000,$100000,$20,$80100020,$108000,$100020,$80008020,0,$80000000,$8000,$108020,$80100000,$100020,$80000020,0,$108000,$8020,$80108000,$80100000,$8020,0,$108020,$80100020,$100000,$80008020,$80100000,$80108000,$8000,$80100000,$80008000,$20,$80108020,$108020,$20,$8000,$80000000,$8020,$80108000,$100000,$80000020,$100020,$80008020,$80000020,$100020,$108000,0,$80008000,$8020,$80000000,$80100020,$80108020,$108000);
   spfunction3 : array[0..63] of dword = ($208,$8020200,0,$8020008,$8000200,0,$20208,$8000200,$20008,$8000008,$8000008,$20000,$8020208,$20008,$8020000,$208,$8000000,$8,$8020200,$200,$20200,$8020000,$8020008,$20208,$8000208,$20200,$20000,$8000208,$8,$8020208,$200,$8000000,$8020200,$8000000,$20008,$208,$20000,$8020200,$8000200,0,$200,$20008,$8020208,$8000200,$8000008,$200,0,$8020008,$8000208,$20000,$8000000,$8020208,$8,$20208,$20200,$8000008,$8020000,$8000208,$208,$8020000,$20208,$8,$8020008,$20200);
   spfunction4 : array[0..63] of dword = ($802001,$2081,$2081,$80,$802080,$800081,$800001,$2001,0,$802000,$802000,$802081,$81,0,$800080,$800001,$1,$2000,$800000,$802001,$80,$800000,$2001,$2080,$800081,$1,$2080,$800080,$2000,$802080,$802081,$81,$800080,$800001,$802000,$802081,$81,0,0,$802000,$2080,$800080,$800081,$1,$802001,$2081,$2081,$80,$802081,$81,$1,$2000,$800001,$2001,$802080,$800081,$2001,$2080,$800000,$802001,$80,$800000,$2000,$802080);
   spfunction5 : array[0..63] of dword = ($100,$2080100,$2080000,$42000100,$80000,$100,$40000000,$2080000,$40080100,$80000,$2000100,$40080100,$42000100,$42080000,$80100,$40000000,$2000000,$40080000,$40080000,0,$40000100,$42080100,$42080100,$2000100,$42080000,$40000100,0,$42000000,$2080100,$2000000,$42000000,$80100,$80000,$42000100,$100,$2000000,$40000000,$2080000,$42000100,$40080100,$2000100,$40000000,$42080000,$2080100,$40080100,$100,$2000000,$42080000,$42080100,$80100,$42000000,$42080100,$2080000,0,$40080000,$42000000,$80100,$2000100,$40000100,$80000,0,$40080000,$2080100,$40000100);
   spfunction6 : array[0..63] of dword = ($20000010,$20400000,$4000,$20404010,$20400000,$10,$20404010,$400000,$20004000,$404010,$400000,$20000010,$400010,$20004000,$20000000,$4010,0,$400010,$20004010,$4000,$404000,$20004010,$10,$20400010,$20400010,0,$404010,$20404000,$4010,$404000,$20404000,$20000000,$20004000,$10,$20400010,$404000,$20404010,$400000,$4010,$20000010,$400000,$20004000,$20000000,$4010,$20000010,$20404010,$404000,$20400000,$404010,$20404000,0,$20400010,$10,$4000,$20400000,$404010,$4000,$400010,$20004010,0,$20404000,$20000000,$400010,$20004010);
   spfunction7 : array[0..63] of dword = ($200000,$4200002,$4000802,0,$800,$4000802,$200802,$4200800,$4200802,$200000,0,$4000002,$2,$4000000,$4200002,$802,$4000800,$200802,$200002,$4000800,$4000002,$4200000,$4200800,$200002,$4200000,$800,$802,$4200802,$200800,$2,$4000000,$200800,$4000000,$200800,$200000,$4000802,$4000802,$4200002,$4200002,$2,$200002,$4000000,$4000800,$200000,$4200800,$802,$200802,$4200800,$802,$4000002,$4200802,$4200000,$200800,0,$2,$4200802,0,$200802,$4200000,$800,$4000002,$4000800,$800,$200002);
   spfunction8 : array[0..63] of dword = ($10001040,$1000,$40000,$10041040,$10000000,$10001040,$40,$10000000,$40040,$10040000,$10041040,$41000,$10041000,$41040,$1000,$40,$10040000,$10000040,$10001000,$1040,$41000,$40040,$10040040,$10041000,$1040,0,0,$10040040,$10000040,$10001000,$41040,$40000,$41040,$40000,$10041000,$1000,$40,$10040040,$1000,$41040,$10001000,$40,$10000040,$10040000,$10040040,$10000000,$40000,$10001040,0,$10041040,$40040,$10000040,$10040000,$10001000,$10001040,0,$10041040,$41000,$41000,$1040,$1040,$40040,$10000000,$10041000);
var
   keys:fdArray;
   m, i, j,k,mm:integer;
   temp, temp2, right1, right2, left, right:dword;
   looping:array of integer;
   cbcleft, cbcleft2, cbcright, cbcright2:dword;
   endloop, loopinc:integer;
   len, iterations:integer;
   chunk:integer;
   tempresult:string;
begin
   //create the 16 or 48 subkeys we will need
   keys := des_createKeys(key);
   m:=0;cbcleft:=0;cbcleft2:=0;cbcright:=0;cbcright2:=0;chunk:=0;
   len := length(smessage);
   //set up the loops for single and triple des
   if length(keys) = 32 then
     iterations := 3
   else
     iterations := 9;
   if iterations = 3 then
     begin
       if encrypt = 1 then
         begin
           setlength(looping,3);
           looping[0] := 0;
           looping[1] := 32;
           looping[2] := 2;
         end
       else
         begin
           setlength(looping,3);
           looping[0] := 30;
           looping[1] := -2;
           looping[2] := -2;
         end;
     end
   else
     begin
       if encrypt = 1 then
         begin
           setlength(looping,9);
           looping[0] := 0;
           looping[1] := 32;
           looping[2] := 2;
           looping[3] := 62;
           looping[4] := 30;
           looping[5] := -2;
           looping[6] := 64;
           looping[7] := 96;
           looping[8] := 2;
         end
       else
         begin
           setlength(looping,9);
           looping[0] := 94;
           looping[1] := 62;
           looping[2] := -2;
           looping[3] := 32;
           looping[4] := 64;
           looping[5] := 2;
           looping[6] := 30;
           looping[7] := -2;
           looping[8] := -2;
         end;
     end;
   //*********下面的是關鍵部分及對於c#補位( 待加密資料按照PKCS5規則進行補位。(缺7位補7個0x07,缺6位則補6個0x06,以次類推,如果正好8位,也需要補8個0x08)*********
   mm:=   8-Length(smessage) mod 8 ;
   for k:=0 to mm-1 do
    begin
    smessage:= smessage +chr(mm);
   end;
   //store the result here
   result := '';
   tempresult := '';
   if mode = 1 then //CBC mode (這裡也是關鍵C#DES加密預設是CBC模式)
     begin
       cbcleft := (ord(iv[m+1]) shl 24) or (ord(iv[m+2]) shl 16) or (ord(iv[m+3]) shl 8) or ord(iv[m+4]);
       cbcright := (ord(iv[m+5]) shl 24) or (ord(iv[m+6]) shl 16) or (ord(iv[m+7]) shl 8) or ord(iv[m+8]);
       m:=0;
     end;
   //loop through each 64 bit chunk of the message


  if    encrypt=1 then  len:=Length(smessage); //(加密也和c#一樣)
   while m < len do
     begin
       left := (ord(smessage[m+1]) shl 24) or (ord(smessage[m+2]) shl 16) or (ord(smessage[m+3]) shl 8) or ord(smessage[m+4]);
       right := (ord(smessage[m+5]) shl 24) or (ord(smessage[m+6]) shl 16) or (ord(smessage[m+7]) shl 8) or ord(smessage[m+8]);
       m := m + 8;
       //for Cipher Block Chaining mode, xor the message with the previous result
       if mode = 1 then
         if encrypt=1 then
           begin
             left := left xor cbcleft;
             right := right xor cbcright;
           end
         else
           begin
             cbcleft2 := cbcleft;
             cbcright2 := cbcright;
             cbcleft := left;
             cbcright := right;
           end;
       //first each 64 but chunk of the message must be permuted according to IP
       temp := ((left shr 4) xor right) and $0f0f0f0f; right := right xor temp; left := left xor (temp shl 4);
       temp := ((left shr 16) xor right) and $0000ffff; right := right xor temp; left := left xor (temp shl 16);
       temp := ((right shr 2) xor left) and $33333333; left := left xor temp; right := right xor (temp shl 2);
       temp := ((right shr 8) xor left) and $00ff00ff; left := left xor temp; right := right xor (temp shl 8);
       temp := ((left shr 1) xor right) and $55555555; right := right xor temp; left := left xor (temp shl 1);
       left := ((left shl 1) or (left shr 31));
       right := ((right shl 1) or (right shr 31));
       //do this either 1 or 3 times for each chunk of the message
       j:=0;
       while j<iterations do
         begin
           endloop := looping[j+1];
           loopinc := looping[j+2];
           //now go through and perform the encryption or decryption
           i:= looping[j];
           while i<>endloop do
             begin
               right1 := right xor keys[i];
               right2 := ((right shr 4) or (right shl 28)) xor keys[i+1];
               //the result is attained by passing these bytes through the S selection functions
               temp := left;
               left := right;
               right := temp xor (spfunction2[(right1 shr 24) and $3f] or spfunction4[(right1 shr 16) and $3f]
                        or spfunction6[(right1 shr   8) and $3f] or spfunction8[right1 and $3f]
                        or spfunction1[(right2 shr 24) and $3f] or spfunction3[(right2 shr 16) and $3f]
                        or spfunction5[(right2 shr   8) and $3f] or spfunction7[right2 and $3f]);
               i:=i+loopinc;
             end;
           temp := left; left := right; right := temp; //unreverse left and right
           j:=j+3;
         end; //for either 1 or 3 iterations
       //move then each one bit to the right
       left := ((left shr 1) or (left shl 31));
       right := ((right shr 1) or (right shl 31));
       //now perform IP-1, which is IP in the opposite direction
       temp := ((left shr 1) xor right) and $55555555; right := right xor temp; left :=left xor (temp shl 1);
       temp := ((right shr 8) xor left) and $00ff00ff; left := left xor temp; right := right xor (temp shl 8);
       temp := ((right shr 2) xor left) and $33333333; left := left xor temp; right := right xor (temp shl 2);
       temp := ((left shr 16) xor right) and $0000ffff; right := right xor temp; left := left xor (temp shl 16);
       temp := ((left shr 4) xor right) and $0f0f0f0f; right := right xor temp; left := left xor (temp shl 4);
       //for Cipher Block Chaining mode, xor the message with the previous result
       if mode = 1 then
         if encrypt=1 then
           begin
           cbcleft := left; cbcright := right;
           end
         else
           begin
             left :=left xor cbcleft2;
             right := right xor cbcright2;
           end;
       tempresult := tempresult + chr(left shr 24) + chr((left shr 16) and $ff) + chr((left shr 8) and $ff) + chr(left and $ff) + chr(right shr 24) + chr((right shr 16) and $ff) + chr((right shr 8) and $ff) + chr(right and $ff);
        chunk := chunk + 8;
       if chunk = 512 then
         begin
           result := result + tempresult; tempresult := ''; chunk := 0;
         end;
     end; //for every 8 characters, or 64 bits in the message
   //return the result as an array
   result := result + tempresult;
end; //end of des




//des_createKeys
//this takes as input a 64 bit key (even though only 56 bits are used)
//as an array of 2 dwords, and returns 16 48 bit keys
function des_createKeys(key:string):fdArray;
const
   //declaring this locally speeds things up a bit
   pc2bytes0   :array[0..15] of dword= (0,$4,$20000000,$20000004,$10000,$10004,$20010000,$20010004,$200,$204,$20000200,$20000204,$10200,$10204,$20010200,$20010204);
   pc2bytes1   :array[0..15] of dword= (0,$1,$100000,$100001,$4000000,$4000001,$4100000,$4100001,$100,$101,$100100,$100101,$4000100,$4000101,$4100100,$4100101);
   pc2bytes2   :array[0..15] of dword= (0,$8,$800,$808,$1000000,$1000008,$1000800,$1000808,0,$8,$800,$808,$1000000,$1000008,$1000800,$1000808);
   pc2bytes3   :array[0..15] of dword= (0,$200000,$8000000,$8200000,$2000,$202000,$8002000,$8202000,$20000,$220000,$8020000,$8220000,$22000,$222000,$8022000,$8222000);
   pc2bytes4   :array[0..15] of dword= (0,$40000,$10,$40010,0,$40000,$10,$40010,$1000,$41000,$1010,$41010,$1000,$41000,$1010,$41010);
   pc2bytes5   :array[0..15] of dword= (0,$400,$20,$420,0,$400,$20,$420,$2000000,$2000400,$2000020,$2000420,$2000000,$2000400,$2000020,$2000420);
   pc2bytes6   :array[0..15] of dword= (0,$10000000,$80000,$10080000,$2,$10000002,$80002,$10080002,0,$10000000,$80000,$10080000,$2,$10000002,$80002,$10080002);
   pc2bytes7   :array[0..15] of dword= (0,$10000,$800,$10800,$20000000,$20010000,$20000800,$20010800,$20000,$30000,$20800,$30800,$20020000,$20030000,$20020800,$20030800);
   pc2bytes8   :array[0..15] of dword= (0,$40000,0,$40000,$2,$40002,$2,$40002,$2000000,$2040000,$2000000,$2040000,$2000002,$2040002,$2000002,$2040002);
   pc2bytes9   :array[0..15] of dword= (0,$10000000,$8,$10000008,0,$10000000,$8,$10000008,$400,$10000400,$408,$10000408,$400,$10000400,$408,$10000408);
   pc2bytes10 :array[0..15] of dword= (0,$20,0,$20,$100000,$100020,$100000,$100020,$2000,$2020,$2000,$2020,$102000,$102020,$102000,$102020);
   pc2bytes11 :array[0..15] of dword= (0,$1000000,$200,$1000200,$200000,$1200000,$200200,$1200200,$4000000,$5000000,$4000200,$5000200,$4200000,$5200000,$4200200,$5200200);
   pc2bytes12 :array[0..15] of dword= (0,$1000,$8000000,$8001000,$80000,$81000,$8080000,$8081000,$10,$1010,$8000010,$8001010,$80010,$81010,$8080010,$8081010);
   pc2bytes13 :array[0..15] of dword= (0,$4,$100,$104,0,$4,$100,$104,$1,$5,$101,$105,$1,$5,$101,$105);
    //now define the left shifts which need to be done
   shifts :array[0..15] of dword = (0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0);
var
   iterations:integer;
   keys:fdArray;
   lefttemp, righttemp, temp:dword;
   m, n, j,i:integer;
   left,right:dword;
begin
   //how many iterations (1 for des, 3 for triple des)
   if length(key) = 24 then
     iterations := 3
   else
     iterations := 1;
   //stores the return keys
   setlength(keys,32 * iterations);
   //other variables
   m:=0;n:=0;
   for j:=0 to iterations-1 do //either 1 or 3 iterations
     begin
       left := (ord(key[m+1]) shl 24) or (ord(key[m+2]) shl 16) or (ord(key[m+3]) shl 8) or ord(key[m+4]);
       right := (ord(key[m+5]) shl 24) or (ord(key[m+6]) shl 16) or (ord(key[m+7]) shl 8) or ord(key[m+8]);
       m:=m+8;
       temp := ((left shr 4) xor right) and $0f0f0f0f; right :=right xor temp; left :=left xor (temp shl 4);
       temp := ((right shr 16) xor left) and $0000ffff; left := left xor temp; right :=right xor (temp shl 16);
       temp := ((left shr 2) xor right) and $33333333; right :=right xor temp; left := left xor (temp shl 2);
       temp := ((right shr 16) xor left) and $0000ffff; left :=left xor temp; right := right xor (temp shl 16);
       temp := ((left shr 1) xor right) and $55555555; right := right xor temp; left := left xor (temp shl 1);
       temp := ((right shr 8) xor left) and $00ff00ff; left :=left xor temp; right := right xor (temp shl 8);
       temp := ((left shr 1) xor right) and $55555555; right :=right xor temp; left := left xor (temp shl 1);
       //the right side needs to be shifted and to get the last four bits of the left side
       temp := (left shl 8) or ((right shr 20) and $000000f0);
       //left needs to be put upside down
       left := (right shl 24) or ((right shl 8) and $ff0000) or ((right shr 8) and $ff00) or ((right shr 24) and $f0);
       right := temp;
       //now go through and perform these shifts on the left and right keys
       for i:=low(shifts) to   high(shifts) do
         begin
           //shift the keys either one or two bits to the left
           if shifts[i] > 0 then
             begin
               left := (left shl 2) or (left shr 26);
               right := (right shl 2) or (right shr 26);
               //left := left shl 0;
               //right:= right shl 0;
             end
           else
             begin
               left := (left shl 1) or (left shr 27);
               right := (right shl 1) or (right shr 27);
               //left := left shl 0;
               //right:= right shl 0;
             end;
           left := left and $fffffff0;
           right:= right and $fffffff0;
           //now apply PC-2, in such a way that E is easier when encrypting or decrypting
           //this conversion will look like PC-2 except only the last 6 bits of each byte are used
           //rather than 48 consecutive bits and the order of lines will be according to
           //how the S selection functions will be applied: S2, S4, S6, S8, S1, S3, S5, S7
           lefttemp := pc2bytes0[left shr 28] or pc2bytes1[(left shr 24) and $f]
                       or pc2bytes2[(left shr 20) and $f] or pc2bytes3[(left shr 16) and $f]
                       or pc2bytes4[(left shr 12) and $f] or pc2bytes5[(left shr 8) and $f]
                       or pc2bytes6[(left shr 4) and $f];
           righttemp := pc2bytes7[right shr 28] or pc2bytes8[(right shr 24) and $f]
                        or pc2bytes9[(right shr 20) and $f] or pc2bytes10[(right shr 16) and $f]
                        or pc2bytes11[(right shr 12) and $f] or pc2bytes12[(right shr 8) and $f]
                        or pc2bytes13[(right shr 4) and $f];
           temp := ((righttemp shr 16) xor lefttemp) and $0000ffff;
           keys[n+0] := lefttemp xor temp;
           keys[n+1] := righttemp xor (temp shl 16);
           n:=n+2;
         end;
     end; //for each iterations
   //return the keys we've created
   Result := keys;
end;//end of des_createKeys




function StrToHex(Str:string):string;
var
   i:integer;
begin
   result := '';
   for i := 1 to length(Str) do
     result := result + IntToHex(Ord(Str[i]),2);
end;


function HexToStr(Hex:string):string;
var
   i:Integer;
begin
   Result := '';
   for i := 1 to length(Hex) div 2 do
     if IsInt('$' + Hex[i * 2 - 1] + Hex[i * 2]) then
       Result := Result + Chr(StrToInt('$' + Hex[i * 2 - 1] + Hex[i * 2]));
end;


function IsInt(Str:String):Boolean;
begin
   result := True;
   try
     StrToInt(Str);
   except
     result := False
   end;
end;




{function EncryStr_3DES(Str, Key: String): String;
var s  ,StrResult, TempResult, Temp: String;
 I: Integer;
begin
  if Length(Key) < 16 then
    while Length(Key) < 16 do
      Key := Key + Chr(0);
   s := EncryStrHex(Str, Copy(Key, 1, 8));
   s := DecryStrHex(s, Copy(Key, 9, 8));
   s := EncryStrHex(s, Copy(Key, 1, 8));
      Result := s;
end;  }


end.

相關推薦

DELPHIPHPC#通用DES編碼解碼單元 (DELPHI使用的程式碼)

unit uDES; {*********************************************************} {* DELPHI、PHP、C#通用DES編碼解碼單元 *} {* blessed

JavaC++PythonRubyPHPC#和JavaScript的理解

皮膚 叔叔 保持 大學 學校 cti java 等等 無需 Java、C++、Python、Ruby、PHP、C#和JavaScript和日本動漫裏的那些大家熟悉的動漫人物結合起來。依據他們的身世、個人經歷來生動的表達各編程語言的發展歷程。原文內容例

大數據Hadoop Streaming編程實戰之C++PhpPython

大數據編程 PHP語言 Python編程 C語言的應用 Streaming框架允許任何程序語言實現的程序在HadoopMapReduce中使用,方便已有程序向Hadoop平臺移植。因此可以說對於hadoop的擴展性意義重大。接下來我們分別使用C++、Php、Python語言實現HadoopWo

一文了解c/c++javaJavaScriptphpPython的用途

BE 算法實現 分布式 底層 web服務器 物聯網 文檔 性能 爆發 編程語言是用來定義計算機程序的形式語言。它是一種被標準化的交流技巧,用來向計算機發出指令。一種計算機語言讓程序員能夠準確地定義計算機所需要使用的數據,並精確地定義在不同情況下所應當采取的行動。 C和C+

JavaCC++C#phppython語言的內在特性及應用

當你選擇了網際網路這個行業也就意味著你要終身學習,想必現在的你一定驚歎網際網路的發展速度吧! 網際網路行業不比傳統行業,不是說你精通一門手藝就可以一輩子靠這個手藝來養活自己,網際網路行業沒有這回事,如果你想問有沒有哪一門語言學完之後可以養活自己一輩子,那麼抱歉,我想沒人能回答你。 網際網路發

JavaCC+ +PHPPython分別用來開發什麼?一篇文章告訴你!

我自己是一名大資料架構師,目前辭職在做線上教育大資料講師,每天都會直播分享免費公開課,大家可以加群參加。以及我自己整理了一套最新的大資料學習系統教程,包括Hadoop,資料探勘,資料分析。送給正在學習大資料的小夥伴!這裡是大資料學習者聚集地,歡迎初學和進階中的小夥伴!加QQ群:5849001

CC++JavaJavaScriptPHPPythonRuby 這些語言分別主要用來開發什麼?

pansz,歡迎評論 此貼純科普用,以下僅僅說主要用途,其他用途限於篇幅關係省略之,不要鑽牛角尖。 C:系統底層,驅動程式,嵌入式底層,基礎服務程式。 C++:上層服務程式,應用API,大型3D遊戲。 Java:服務端應用程式,以及客戶端應用程式。 JS:在瀏覽器中執行的程式。 PHP:Web伺

CC++JavaJavaScriptPHPPythonRuby這些語言分別主要用來開發什麼?

c語言主要用於底層和驅動,編譯器開發 c語言高效底層,主要用於底層的開發,比如一些系統驅動;unix,linux系統和其上相關應用的開發; 有很多語言比如python、php、perl、ruby等都c語言開發的這些語言的核心庫,編譯器等開發都是c語言。比如鳥哥的php7的開發,就基

程式設計科普,CC++JavaPHPPython分別用來開發什麼?

首先,我們先普及一下程式語言的基礎知識。用任何程式語言來開發程式,都是為了讓計算機幹活。比如編寫一篇文章,下載一首MP3等。 而計算機幹活的CPU只認識機器的指令。所以,儘管不同的程式語言差異極大,最後都得“翻譯”成CPU可以執行的機器指令。 理論上任何語言幹任

C++PHPJavascript...對lambda表示式的支援

lambda lambda表示式,也叫Closure(閉包),也叫匿名函式。由於其強大之處,幾乎被所有主流開發語言支援,本文試圖列出大部分語言中lambda表示式的樣例程式碼,後續持續更新。 PHP對lambda的支援 <?php $i = 12;

正則表示式總結(JavaScriptpythonPHPgolangC++javaC#)之彙總

第一種:JavaScript(ES6) A:分隔符: 例如:reg=/\d(.)\1/g  (切記:不能帶單引號和雙引號) X:ES6之新規則:s 修飾符:dotAll 模式 正則表示式中,點(.)是一個特殊字元,代表任意的單個字元,但是行終止符(line terminat

CC++JavaJavaScriptPHPPython有啥區別,終於搞清楚了

tst 平臺 暴雪 一個 巨無霸 web瀏覽器 elastic 高效 開發 c語言主要用於底層和驅動,編譯器開發 c語言高效底層,主要用於底層的開發,比如一些系統驅動;unix,linux系統和其上相關應用的開發; 有很多語言比如python、php、perl、ruby

JavaPythonC++PHPJavaScript這5大程式語言,我究竟該選哪個?

  很多朋友在後臺給我留言,問:現在這麼多程式語言,Python、Java、PHP、C++、JavaScript等,

代寫JsonphpJavascritp編程作業 Google Places API

end ont examples format num saving ats sam href 代寫Json、php、Javascritp編程作業 Google Places APITravel and Entertainment Search Server-side Sc

CentOS7上安裝並配置NginxPHPMySql

是否 cnblogs cif 藍色 進程id 其中 ram 否則 usr 一、Nginx 1、安裝nginx yum install nginx 2、啟動nginx systemctl start nginx 除了systemctl start nginx之外,

gentoo安裝apachenginxphpmariadbopenssl(https)

alt 現在 bubuko 都是 ria https協議 圖片 裝系統 cat 本文用於記錄用gentoo安裝apache、nginx、php、mariadb、openssl(https),之前安裝花費了幾天時間,現記錄以供以後查閱,歡迎指點。 由於安裝的時候沒有做筆記,現

【Ubuntu】配置ApachePHPMySQL軟體開發三件套

今天,我在ubuntu下配置了一個Apache伺服器。通過Apache我們可以學習php網路程式設計,可以用它來部署自己本地的wordpress部落格,從而進一步通過網路和朋友交流。從此,你將深刻體會到網路帶個我們的神奇力量,至少我是這樣覺得的~~ 步驟一,安裝apache2

JavaScriptPHPPython三種語言

一、變數 1.JavaScript var A = 1; var B = 'str'; 2.Python a = 123 b = 'str' 3.PHP $a = 123; $b = 'str'; 二、字串 1、字串合併操作:“ + ” 2、parseInt() 將數

阿里雲CentOS 7.3 裸機搭建 ApacheMySqlPHPNode環境並繫結域名

阿里雲CentOS 7.3 裸機搭建 Apache、MySql、PHP、Node境、並繫結域名 最近一直想在阿里雲申請一個伺服器,可以在上面跑一些服務,輸入域名訪問,那種感覺肯定很不一樣。所以就花學生價買了一年,還是挺划算的。 域名備案花了挺長時間,又上傳照片又打電話核實的挺麻煩的,不過

Mac 平臺搭建PHP開發環境:NginxPHPMySQL.md

之前懶得配置mac的開發環境,都是用的一個叫MAMP的整合包,簡單的專案就用那個,複雜的就全部用hg甩到ubuntu的虛擬機器裡去執行,時間一長,就覺得很麻煩,所以只能自己動手配置下mac的開發環境了。 那我就不廢話了,直接開始安裝步驟了吧!我怕再囉嗦,你們的板磚就飛過來了v。