VFP ·R¥ÎªÌªÀ°Ï ­º­¶ VFP ·R¥ÎªÌªÀ°Ï
¥»°Q½×°Ï¬° Visual Foxpro ·R¥ÎªÌ¸gÅç¥æ¬yªº¦a¤è, ½Ð¦h¦h§Q¥Î"·j´M"ªº¥\¯à, ¥ý¬d¬Ý¬Ý¦³µL«e¨Ò¥i´`, ¦pªGÁÙ¦³¤£À´ªº¦Aµo°Ý. ³¡¥÷¥DÃD¦³ªþ¥[ÀÉ®×, ¶·¥ýµù¥U¦¨¬°ªÀ°Ï©~¥Á¤~¥i¥H¤U¸ü.
 
 ±`¨£°ÝÃD±`¨£°ÝÃD   ·j´M·j´M   ·|­û¦Cªí·|­û¦Cªí   ·|­û¸s²Õ·|­û¸s²Õ   ·|­ûµù¥U·|­ûµù¥U 
 ­Ó¤H¸ê®Æ­Ó¤H¸ê®Æ   µn¤JÀˬd±zªº¨p¤H°T®§µn¤JÀˬd±zªº¨p¤H°T®§   µn¤Jµn¤J

MD5 µ{¦¡

 
µoªí·s¥DÃD   ¦^ÂÐ¥DÃD    VFP ·R¥ÎªÌªÀ°Ï ­º­¶ -> VFP °Q½×°Ï
¤W¤@½g¥DÃD :: ¤U¤@½g¥DÃD  
µoªí¤H ¤º®e
¦¶¨|¿³



µù¥U®É¶¡: 2003-08-25
¤å³¹: 661
¨Ó¦Û: ¥x¤¤¥«¤j¨½°Ï

²Ä 1 ¼Ó

µoªíµoªí©ó: ¬P´Á¤­ ¤T¤ë 10, 2017 3:14 pm    ¤å³¹¥DÃD: MD5 µ{¦¡ ¤Þ¨¥¦^ÂÐ

³o¬O¥h¦~À°¤@¦ìª°¤Í¼gªº¡A¶K¤W¨Ó¡A¯Âºé¬O§K±o¥H«á­n§ä³o¨Çµ{¦¡½X¡A©È¦b¦Û¤v¹q¸£¤¤§ä¤£¨ì
³o¨Ç¤º®e°O±o¬O¤WºôªF§Û§Û¦è§Û§Û¡AµM«á¦A¨Ì¦Û¤vªº¼g§@²ßºD¾ã²zªº

¥N½X:

* ------------------------------------------------------------------- *
* µ{¦¡¦WºÙ¡GMD5.PRG
* »¡©ú¡G±N¶Ç¤Jªº¦r¦ê¡A¸g MD5 ½s½X«á¶Ç¦^
* «Ø¥ß¤é´Á¡G2016/06/02
* §ó·s¤é´Á¡G2016/06/02
* ------------------------------------------------------------------- *
* °Ñ¼Æ               «¬ºA »¡©ú
* ------------------ ---- -------------------------------------------
* Input:
*   LP_cToCodingStr  C    ­n½s½Xªº¦r¦ê
*   (LP_nCodingBits) N    ¥H¦h¤Ö¦ì¤¸½s½X¡C32 (¹w³]­È) ©Î 16 ¨âºØ
* Output:
*   Wo_cTransMD5Str  C    A.¸g MD5 ½s½X«áªº¦r¦ê
*                         B.LP_nCodingBits = 32 => ¿é¥X 32 Bytes ¦r¦ê
*                           LP_nCodingBits = 16 => ¿é¥X 16 Bytes ¦r¦ê
* ½d¨Ò¡G
* ? MD5("The quick brown fox jumps over the lazy dog")
* 9e107d9d372bb6826bd81d3542a419d6
* ------------------------------------------------------------------- *
LPARAMETERS LP_cToCodingStr, LP_nCodingBits

LOCAL Wo_cTransMD5Str  && C ¸g MD5 ½s½X«áªº¦r¦ê

Wo_cTransMD5Str = ""

* -------- *
* °Ñ¼ÆÀˬd *
* -------- *
IF TYPE("LP_cToCodingStr") <> "C"
  RETURN Wo_cTransMD5Str
ENDIF

IF TYPE("LP_nCodingBits") <> "N"
  LP_nCodingBits = 32
ENDIF
IF !INLIST(LP_nCodingBits, 16, 32)
  LP_nCodingBits = 32
ENDIF

* ------------ *
* °Ï°ìÅܼƫŧi *
* ------------ *
LOCAL W1_nBYTES_TO_A_WORD,;  && N
      W1_nBITS_TO_A_WORD,;   && N
      W1_nMODULUS_BITS,;     && N
      W1_nCONGRUENT_BITS     && N

LOCAL W1_nS11,;  && N
      W1_nS12,;  && N
      W1_nS13,;  && N
      W1_nS14,;  && N
      W1_nS21,;  && N
      W1_nS22,;  && N
      W1_nS23,;  && N
      W1_nS24,;  && N
      W1_nS31,;  && N
      W1_nS32,;  && N
      W1_nS33,;  && N
      W1_nS34,;  && N
      W1_nS41,;  && N
      W1_nS42,;  && N
      W1_nS43,;  && N
      W1_nS44    && N

LOCAL W1_nSUB_A,;            && N FOR ... ENDFOR °j°é¾n¼Ð
      W1_nToCodingStrLen,;   && N ­n½s½Xªº¦r¦êªø«×
      W1_nRow4NumberOfWords  && N ¬ÛÃö°}¦C(W1_aWordArray, W1_aX)ªº¦C¼Æ

LOCAL W1_nA, W1_nB, W1_nC, W1_nD, W1_nAA, W1_nBB, W1_nCC, W1_nDD  && N

* ------------ *
* ¨p¦³Åܼƫŧi *
* ------------ *
PRIVATE M_nBITS_TO_A_BYTE  && N

DIMENSION M_a2Power[31]    && A ¦s©ñ 2 ªº¦¸¤è(0 .. 30)¡C2^0, 2^1, .., 2^30
DIMENSION M_aOnBits[31]    && A ¦s©ñ 2 ªº¦¸¤è(1 .. 31) ´î 1¡C2^1-1, 2^2-1, .., 2^31-1

* -------------- *
* ¨p¦³Åܼƪì©l­È *
* -------------- *
FOR W1_nSUB_A = 1 TO 31
  IF W1_nSUB_A = 1
    M_a2Power[W1_nSUB_A] = 1
  ELSE
    M_a2Power[W1_nSUB_A] = M_a2Power[W1_nSUB_A-1] * 2
  ENDIF
ENDFOR

FOR W1_nSUB_A = 1 TO 31
  IF W1_nSUB_A = 31
    M_aOnBits[W1_nSUB_A] = M_a2Power[W1_nSUB_A] * 2 - 1
  ELSE
    M_aOnBits[W1_nSUB_A] = M_a2Power[W1_nSUB_A+1] - 1
  ENDIF
ENDFOR

M_nBITS_TO_A_BYTE = 8

* -------------- *
* °Ï°ìÅܼƪì©l­È *
* -------------- *
W1_nBYTES_TO_A_WORD = 4
W1_nBITS_TO_A_WORD  = 32
W1_nMODULUS_BITS    = 512
W1_nCONGRUENT_BITS  = 448

W1_nS11 = 07
W1_nS12 = 12
W1_nS13 = 17
W1_nS14 = 22
W1_nS21 = 05
W1_nS22 = 09
W1_nS23 = 14
W1_nS24 = 20
W1_nS31 = 04
W1_nS32 = 11
W1_nS33 = 16
W1_nS34 = 23
W1_nS41 = 06
W1_nS42 = 10
W1_nS43 = 15
W1_nS44 = 21

W1_nToCodingStrLen    = LEN(LP_cToCodingStr)
W1_nRow4NumberOfWords = (INT((W1_nToCodingStrLen + INT((W1_nMODULUS_BITS - W1_nCONGRUENT_BITS) / M_nBITS_TO_A_BYTE)) / INT(W1_nMODULUS_BITS / M_nBITS_TO_A_BYTE)) + 1) * INT(W1_nMODULUS_BITS / W1_nBITS_TO_A_WORD)

* ----------------------- *
* «Ø¥ß W1_aWordArray °}¦C *
* ----------------------- *
LOCAL ARRAY W1_aWordArray[W1_nRow4NumberOfWords]  && A
STORE 0 TO W1_aWordArray

LOCAL W1_nBytePosition,;  && N
      W1_nByteCount,;     && N
      W1_nWordCount       && N

W1_nBytePosition = 0
W1_nByteCount    = 0

DO WHILE W1_nByteCount < W1_nToCodingStrLen
  W1_nWordCount    = INT(W1_nByteCount / W1_nBYTES_TO_A_WORD)
  W1_nBytePosition = MOD(W1_nByteCount, W1_nBYTES_TO_A_WORD) * M_nBITS_TO_A_BYTE

  W1_aWordArray[W1_nWordCount+1] = BITOR(W1_aWordArray[W1_nWordCount+1], LShift(ASC(SUBSTR(LP_cToCodingStr, W1_nByteCount+1, 1)), W1_nBytePosition))

  W1_nByteCount = W1_nByteCount + 1
ENDDO

W1_nWordCount    = INT(W1_nByteCount / W1_nBYTES_TO_A_WORD)
W1_nBytePosition = MOD(W1_nByteCount, W1_nBYTES_TO_A_WORD) * M_nBITS_TO_A_BYTE

W1_aWordArray[W1_nWordCount+1]         = BITOR(W1_aWordArray[W1_nWordCount+1], LShift(0x80, W1_nBytePosition))
W1_aWordArray[W1_nRow4NumberOfWords-1] = LShift(W1_nToCodingStrLen, 03)
W1_aWordArray[W1_nRow4NumberOfWords]   = RShift(W1_nToCodingStrLen, 29)

* --------------- *
* «Ø¥ß W1_aX °}¦C *
* --------------- *
DIMENSION W1_aX[W1_nRow4NumberOfWords]

FOR W1_nSUB_A = 1 TO W1_nRow4NumberOfWords
  W1_aX[W1_nSUB_A] = W1_aWordArray[W1_nSUB_A]
ENDFOR

* ----------------------------------------------------------------- *
* ³]©w¿ù»~³B²zµ{§Ç¡G¦] Visual FoxPro ¥»¨­©Ò­­¡A¹ï¤j¼Æªº³B²z¯à¤O¤£°÷ *
* ----------------------------------------------------------------- *
ON ERROR DO ERR_TREAT

* ---- *
*      *
* ---- *
W1_nA = 0x67452301
W1_nB = 0xEFCDAB89
W1_nC = 0x98BADCFE
W1_nD = 0x10325476

FOR W1_nSUB_A = 1 TO W1_nRow4NumberOfWords STEP 16
  W1_nAA = W1_nA
  W1_nBB = W1_nB
  W1_nCC = W1_nC
  W1_nDD = W1_nD

  DO md5_FF WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+00], W1_nS11, 0xD76AA478
  DO md5_FF WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+01], W1_nS12, 0xE8C7B756
  DO md5_FF WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+02], W1_nS13, 0x242070DB
  DO md5_FF WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+03], W1_nS14, 0xC1BDCEEE
  DO md5_FF WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+04], W1_nS11, 0xF57C0FAF
  DO md5_FF WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+05], W1_nS12, 0x4787C62A
  DO md5_FF WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+06], W1_nS13, 0xA8304613
  DO md5_FF WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+07], W1_nS14, 0xFD469501
  DO md5_FF WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+08], W1_nS11, 0x698098D8
  DO md5_FF WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+09], W1_nS12, 0x8B44F7AF
  DO md5_FF WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+10], W1_nS13, 0xFFFF5BB1
  DO md5_FF WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+11], W1_nS14, 0x895CD7BE
  DO md5_FF WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+12], W1_nS11, 0x6B901122
  DO md5_FF WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+13], W1_nS12, 0xFD987193
  DO md5_FF WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+14], W1_nS13, 0xA679438E
  DO md5_FF WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+15], W1_nS14, 0x49B40821

  DO md5_GG WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+01], W1_nS21, 0xF61E2562
  DO md5_GG WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+06], W1_nS22, 0xC040B340
  DO md5_GG WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+11], W1_nS23, 0x265E5A51
  DO md5_GG WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+00], W1_nS24, 0xE9B6C7AA
  DO md5_GG WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+05], W1_nS21, 0xD62F105D
  DO md5_GG WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+10], W1_nS22, 0x2441453
  DO md5_GG WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+15], W1_nS23, 0xD8A1E681
  DO md5_GG WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+04], W1_nS24, 0xE7D3FBC8
  DO md5_GG WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+09], W1_nS21, 0x21E1CDE6
  DO md5_GG WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+14], W1_nS22, 0xC33707D6
  DO md5_GG WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+03], W1_nS23, 0xF4D50D87
  DO md5_GG WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+08], W1_nS24, 0x455A14ED
  DO md5_GG WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+13], W1_nS21, 0xA9E3E905
  DO md5_GG WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+02], W1_nS22, 0xFCEFA3F8
  DO md5_GG WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+07], W1_nS23, 0x676F02D9
  DO md5_GG WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+12], W1_nS24, 0x8D2A4C8A

  DO md5_HH WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+05], W1_nS31, 0xFFFA3942
  DO md5_HH WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+08], W1_nS32, 0x8771F681
  DO md5_HH WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+11], W1_nS33, 0x6D9D6122
  DO md5_HH WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+14], W1_nS34, 0xFDE5380C
  DO md5_HH WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+01], W1_nS31, 0xA4BEEA44
  DO md5_HH WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+04], W1_nS32, 0x4BDECFA9
  DO md5_HH WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+07], W1_nS33, 0xF6BB4B60
  DO md5_HH WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+10], W1_nS34, 0xBEBFBC70
  DO md5_HH WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+13], W1_nS31, 0x289B7EC6
  DO md5_HH WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+00], W1_nS32, 0xEAA127FA
  DO md5_HH WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+03], W1_nS33, 0xD4EF3085
  DO md5_HH WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+06], W1_nS34, 0x4881D05
  DO md5_HH WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+09], W1_nS31, 0xD9D4D039
  DO md5_HH WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+12], W1_nS32, 0xE6DB99E5
  DO md5_HH WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+15], W1_nS33, 0x1FA27CF8
  DO md5_HH WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+02], W1_nS34, 0xC4AC5665

  DO md5_II WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+00], W1_nS41, 0xF4292244
  DO md5_II WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+07], W1_nS42, 0x432AFF97
  DO md5_II WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+14], W1_nS43, 0xAB9423A7
  DO md5_II WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+05], W1_nS44, 0xFC93A039
  DO md5_II WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+12], W1_nS41, 0x655B59C3
  DO md5_II WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+03], W1_nS42, 0x8F0CCC92
  DO md5_II WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+10], W1_nS43, 0xFFEFF47D
  DO md5_II WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+01], W1_nS44, 0x85845DD1
  DO md5_II WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+08], W1_nS41, 0x6FA87E4F
  DO md5_II WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+15], W1_nS42, 0xFE2CE6E0
  DO md5_II WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+06], W1_nS43, 0xA3014314
  DO md5_II WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+13], W1_nS44, 0x4E0811A1
  DO md5_II WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+04], W1_nS41, 0xF7537E82
  DO md5_II WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+11], W1_nS42, 0xBD3AF235
  DO md5_II WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+02], W1_nS43, 0x2AD7D2BB
  DO md5_II WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+09], W1_nS44, 0xEB86D391

  W1_nA = AddUnsigned(W1_nA, W1_nAA)
  W1_nB = AddUnsigned(W1_nB, W1_nBB)
  W1_nC = AddUnsigned(W1_nC, W1_nCC)
  W1_nD = AddUnsigned(W1_nD, W1_nDD)
ENDFOR

ON ERROR  && «ì´_¹w³]ªº¿ù»~³B²z

DO CASE
* > ¿é¥X 16 ¦ì¤¸²Õ
CASE LP_nCodingBits = 16
     Wo_cTransMD5Str = LOWER(WordToHex(W1_nB) + WordToHex(W1_nC))
* > ¿é¥X 32 ¦ì¤¸²Õ
OTHERWISE
     Wo_cTransMD5Str = LOWER(WordToHex(W1_nA) + WordToHex(W1_nB) + WordToHex(W1_nC) + WordToHex(W1_nD))
ENDCASE

RETURN Wo_cTransMD5Str

* ****************** *
* ¨ä¥L¬ÛÃö¨ç¼Æ³]©w°Ï *
* ****************** *
* *************************************************************************** *
FUNCTION LShift
* --------------------------- *
* °Ñ¼Æ               «¬ºA »¡©ú
* ------------------ ---- ----
* Input:
*   LP_nToShiftValue N
*   LP_nShiftBits    N
* Output:
*                    N
* --------------------------- *
LPARAMETERS LP_nToShiftValue, LP_nShiftBits

DO CASE
CASE LP_nShiftBits = 0
     RETURN LP_nToShiftValue
CASE LP_nShiftBits = 31
     IF BITAND(LP_nToShiftValue, 1) <> 0
       RETURN 0x80000000
     ELSE
       RETURN 0
     ENDIF
ENDCASE

IF BITAND(LP_nToShiftValue, M_a2Power[32-LP_nShiftBits]) <> 0
  RETURN BITOR((BITAND(LP_nToShiftValue, M_aOnBits[32-(LP_nShiftBits+1)]) * M_a2Power[LP_nShiftBits+1]), 0x80000000)
ELSE
  RETURN BITAND(LP_nToShiftValue, M_aOnBits[32-LP_nShiftBits]) * M_a2Power[LP_nShiftBits+1]
ENDIF
ENDFUNC

* *************************************************************************** *
FUNCTION RShift
* --------------------------- *
* °Ñ¼Æ               «¬ºA »¡©ú
* ------------------ ---- ----
* Input:
*   LP_nToShiftValue N
*   LP_nShiftBits    N
* Output:
*   Wo_nRShift2      N
* --------------------------- *
LPARAMETERS LP_nToShiftValue, LP_nShiftBits

LOCAL Wo_nRShift2  && N

DO CASE
CASE LP_nShiftBits = 0
     RETURN LP_nToShiftValue
CASE LP_nShiftBits = 31
     IF BITAND(LP_nToShiftValue, 0x80000000)
       RETURN 1
     ELSE
       RETURN 0
     ENDIF
ENDCASE

Wo_nRShift2 = INT(BITAND(LP_nToShiftValue , 0x7FFFFFFE) / M_a2Power[LP_nShiftBits+1])

IF BITAND(LP_nToShiftValue, 0x80000000) <> 0
  Wo_nRShift2 = BITOR(Wo_nRShift2, INT(0x40000000 / M_a2Power[LP_nShiftBits]))
ENDIF

RETURN Wo_nRShift2
ENDFUNC

* *************************************************************************** *
PROCEDURE md5_FF
* ------------------ *
* °Ñ¼Æ     «¬ºA »¡©ú
* -------- ---- ----
* Input & Output:
*   LP_nA  N
* Input:
*   LP_nB  N
*   LP_nC  N
*   LP_nD  N
*   LP_nX  N
*   LP_nS  N
*   LP_nAC N
* ------------------ *
LPARAMETERS LP_nA, LP_nB, LP_nC, LP_nD, LP_nX, LP_nS, LP_nAC

LP_nA = AddUnsigned(LP_nA, AddUnsigned(AddUnsigned(md5_F(LP_nB, LP_nC, LP_nD), LP_nX), LP_nAC))
LP_nA = RotateLeft(LP_nA, LP_nS)
LP_nA = AddUnsigned(LP_nA, LP_nB)
ENDPROC

* *************************************************************************** *
PROCEDURE md5_GG
* ------------------ *
* °Ñ¼Æ     «¬ºA »¡©ú
* -------- ---- ----
* Input & Output:
*   LP_nA  N
* Input:
*   LP_nB  N
*   LP_nC  N
*   LP_nD  N
*   LP_nX  N
*   LP_nS  N
*   LP_nAC N
* ------------------ *
LPARAMETERS LP_nA, LP_nB, LP_nC, LP_nD, LP_nX, LP_nS, LP_nAC

LP_nA = AddUnsigned(LP_nA, AddUnsigned(AddUnsigned(md5_G(LP_nB, LP_nC, LP_nD), LP_nX), LP_nAC))
LP_nA = RotateLeft(LP_nA, LP_nS)
LP_nA = AddUnsigned(LP_nA, LP_nB)
ENDPROC

* *************************************************************************** *
PROCEDURE md5_HH
* ------------------ *
* °Ñ¼Æ     «¬ºA »¡©ú
* -------- ---- ----
* Input & Output:
*   LP_nA  N
* Input:
*   LP_nB  N
*   LP_nC  N
*   LP_nD  N
*   LP_nX  N
*   LP_nS  N
*   LP_nAC N
* ------------------ *
LPARAMETERS LP_nA, LP_nB, LP_nC, LP_nD, LP_nX, LP_nS, LP_nAC

LP_nA = AddUnsigned(LP_nA, AddUnsigned(AddUnsigned(md5_H(LP_nB, LP_nC, LP_nD), LP_nX), LP_nAC))
LP_nA = RotateLeft(LP_nA, LP_nS)
LP_nA = AddUnsigned(LP_nA, LP_nB)
ENDPROC

* *************************************************************************** *
PROCEDURE md5_II
* ------------------ *
* °Ñ¼Æ     «¬ºA »¡©ú
* -------- ---- ----
* Input & Output:
*   LP_nA  N
* Input:
*   LP_nB  N
*   LP_nC  N
*   LP_nD  N
*   LP_nX  N
*   LP_nS  N
*   LP_nAC N
* ------------------ *
LPARAMETERS LP_nA, LP_nB, LP_nC, LP_nD, LP_nX, LP_nS, LP_nAC

LP_nA = AddUnsigned(LP_nA, AddUnsigned(AddUnsigned(md5_I(LP_nB, LP_nC, LP_nD), LP_nX), LP_nAC))
LP_nA = RotateLeft(LP_nA, LP_nS)
LP_nA = AddUnsigned(LP_nA, LP_nB)
ENDPROC

* *************************************************************************** *
FUNCTION AddUnsigned
* ---------------------- *
* °Ñ¼Æ         «¬ºA »¡©ú
* ------------ ---- ----
* Input:
*   LP_nX      N
*   LP_nY      N
* Output:
*   Wo_nResult N
* ---------------------- *
LPARAMETERS LP_nX, LP_nY

LOCAL Wo_nResult  && N

LOCAL W1_nX8, W1_nY8, W1_nX4, W1_nY4  && N

W1_nX8 = BITAND(LP_nX , 0x80000000)
W1_nY8 = BITAND(LP_nY , 0x80000000)
W1_nX4 = BITAND(LP_nX , 0x40000000)
W1_nY4 = BITAND(LP_nY , 0x40000000)

Wo_nResult = BITAND(LP_nX, 0x3FFFFFFF) + BITAND(LP_nY, 0x3FFFFFFF)

DO CASE
CASE BITAND(W1_nX4, W1_nY4) <> 0
     Wo_nResult = BITXOR(BITXOR(BITXOR(Wo_nResult, 0x80000000), W1_nX8), W1_nY8)
CASE BITOR(W1_nX4, W1_nY4) = 0
     Wo_nResult = BITXOR(BITXOR(Wo_nResult, W1_nX8), W1_nY8)
CASE BITAND(Wo_nResult, 0x40000000) = 0
     Wo_nResult = BITXOR(BITXOR(BITXOR(Wo_nResult, 0x40000000), W1_nX8), W1_nY8)
OTHERWISE
     Wo_nResult = BITXOR(BITXOR(BITXOR(Wo_nResult, 0xC0000000), W1_nX8), W1_nY8)
ENDCASE

RETURN Wo_nResult
ENDFUNC

* *************************************************************************** *
FUNCTION md5_F
* ----------------- *
* °Ñ¼Æ    «¬ºA »¡©ú
* ------- ---- ----
* Input:
*   LP_nX N
*   LP_nY N
*   LP_nZ N
* Output:
*         N
* ----------------- *
LPARAMETERS LP_nX, LP_nY, LP_nZ

RETURN BITOR(BITAND(LP_nX, LP_nY), BITAND(BITNOT(LP_nX), LP_nZ))
ENDFUNC

* *************************************************************************** *
FUNCTION md5_G
* ----------------- *
* °Ñ¼Æ    «¬ºA »¡©ú
* ------- ---- ----
* Input:
*   LP_nX N
*   LP_nY N
*   LP_nZ N
* Output:
*         N
* ----------------- *
LPARAMETERS LP_nX, LP_nY, LP_nZ

RETURN BITOR(BITAND(LP_nX, LP_nZ), BITAND(LP_nY, BITNOT(LP_nZ)))
ENDFUNC

* *************************************************************************** *
FUNCTION md5_H
* ----------------- *
* °Ñ¼Æ    «¬ºA »¡©ú
* ------- ---- ----
* Input:
*   LP_nX N
*   LP_nY N
*   LP_nZ N
* Output:
*         N
* ----------------- *
LPARAMETERS LP_nX, LP_nY, LP_nZ

RETURN BITXOR(BITXOR(LP_nX, LP_nY), LP_nZ)
ENDFUNC

* *************************************************************************** *
FUNCTION md5_I
* ----------------- *
* °Ñ¼Æ    «¬ºA »¡©ú
* ------- ---- ----
* Input:
*   LP_nX N
*   LP_nY N
*   LP_nZ N
* Output:
*         N
* ----------------- *
LPARAMETERS LP_nX, LP_nY, LP_nZ

RETURN BITXOR(LP_nY, BITOR(LP_nX, BITNOT(LP_nZ)))
ENDFUNC

* *************************************************************************** *
FUNCTION RotateLeft
* --------------------------- *
* °Ñ¼Æ               «¬ºA »¡©ú
* ------------------ ---- ----
* Input:
*   LP_nToShiftValue N
*   LP_nShiftBits    N
* Output:
*                    N
* --------------------------- *
LPARAMETERS LP_nToShiftValue, LP_nShiftBits

RETURN BITOR(LShift(LP_nToShiftValue, LP_nShiftBits), RShift(LP_nToShiftValue, 32-LP_nShiftBits))
ENDFUNC

* *************************************************************************** *
FUNCTION WordToHex
* --------------------------- *
* °Ñ¼Æ              «¬ºA »¡©ú
* ----------------- ---- ----
* Input:
*   LP_nToTransNum  N
* Output:
*   Wo_cTransHexStr C
* --------------------------- *
LPARAMETERS LP_nToTransNum

LOCAL Wo_cTransHexStr  && C

Wo_cTransHexStr = ""

* ------------ *
* °Ï°ìÅܼƫŧi *
* ------------ *
LOCAL W1_nSUB_A,;  && N FOR ... ENDFOR °j°é¾n¼Ð
      W1_nByte     && N

FOR W1_nSUB_A = 0 TO 3
  W1_nByte        = BITAND(RShift(LP_nToTransNum, W1_nSUB_A * M_nBITS_TO_A_BYTE), M_aOnBits[M_nBITS_TO_A_BYTE])
  Wo_cTransHexStr = Wo_cTransHexStr + RIGHT("00" + Hex(W1_nByte), 2)
ENDFOR

RETURN Wo_cTransHexStr
ENDFUNC

* *************************************************************************** *
FUNCTION Hex
* --------------------------- *
* °Ñ¼Æ              «¬ºA »¡©ú
* ----------------- ---- ----
* Input:
*   LP_nByte  N
* Output:
*   Wo_cTransHexStr C
* --------------------------- *
LPARAMETERS LP_nByte

LOCAL W1_nByte  && N

W1_nByte = LP_nByte

LOCAL Wo_cTransHexStr  && C

Wo_cTransHexStr = ""

* ------------ *
* °Ï°ìÅܼƫŧi *
* ------------ *
LOCAL W1_nY  && N

DO WHILE W1_nByte > 0
  IF W1_nByte >= 16
    W1_nY = W1_nByte % 16
  ELSE
    W1_nY = W1_nByte
  ENDIF
  IF W1_nY < 10 AND W1_nY >= 0
    Wo_cTransHexStr = STR(W1_nY, 1) + Wo_cTransHexStr
  ELSE
    Wo_cTransHexStr = CHR(65+W1_nY-10) + Wo_cTransHexStr
  ENDIF
  W1_nByte = (W1_nByte-W1_nY) / 16
ENDDO

RETURN Wo_cTransHexStr
ENDFUNC

* *************************************************************************** *
PROCEDURE ERR_TREAT
RETURN  && ¦b¦¹³]©w¿ù»~³B²zµ{§Ç
ENDPROC

_________________
§Æ±æ¦³§ó¦h¤H¨Ó°Ñ»P
VFP wiki - »Ý­n¤j®a¤@°_§¹¦¨ªºVFP¹q¤l®Ñ»PFAQ
¦^³»ºÝ
À˵ø·|­û­Ó¤H¸ê®Æ µo°e¨p¤H°T®§ µo°e¹q¤l¶l¥ó MSN Messenger
±q¤§«eªº¤å³¹¶}©lÅã¥Ü:   
µoªí·s¥DÃD   ¦^ÂÐ¥DÃD    VFP ·R¥ÎªÌªÀ°Ï ­º­¶ -> VFP °Q½×°Ï ©Ò¦³ªº®É¶¡§¡¬° ¥x¥_®É¶¡ (GMT + 8 ¤p®É)
²Ä1­¶(¦@1­¶)

 
«e©¹:  
±z µLªk ¦b³o­Óª©­±µoªí¤å³¹
±z µLªk ¦b³o­Óª©­±¦^ÂФ峹
±z µLªk ¦b³o­Óª©­±½s¿è¤å³¹
±z µLªk ¦b³o­Óª©­±§R°£¤å³¹
±z µLªk ¦b³o­Óª©­±¶i¦æ§ë²¼
±z µLªk ¦b³o­Óª©­±ªþ¥[ÀÉ®×
±z µLªk ¦b³o­Óª©­±¤U¸üÀÉ®×


Powered by phpBB © 2001, 2005 phpBB Group
¥¿Å餤¤å»y¨t¥Ñ phpbb-tw ºûÅ@»s§@