base64.monkey2 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. Namespace std.base64
  2. Private
  3. Const CHAR_EQUALS:=61
  4. Const encode:=New Int[](
  5. 65, 66, 67, 68, 69, 70, 71, 72,
  6. 73, 74, 75, 76, 77, 78, 79, 80,
  7. 81, 82, 83, 84, 85, 86, 87, 88,
  8. 89, 90, 97, 98, 99, 100,101,102,
  9. 103,104,105,106,107,108,109,110,
  10. 111,112,113,114,115,116,117,118,
  11. 119,120,121,122,48, 49, 50, 51,
  12. 52, 53, 54, 55, 56, 57, 43, 47 )
  13. Public
  14. #rem monkeydoc Encode binary data to base64 text.
  15. #end
  16. Function EncodeBase64:String( data:UByte Ptr,length:Int )
  17. Local buf:=New Stack<UByte>,tmp:=New UByte[3],i:=0,j:=0
  18. While i<length
  19. tmp[j]=data[i] ; j+=1 ; i+=1
  20. If j=3
  21. buf.Add( encode[ (tmp[0] & $fc) Shr 2 ] )
  22. buf.Add( encode[ (tmp[0] & $03) Shl 4 | (tmp[1] & $f0) Shr 4 ] )
  23. buf.Add( encode[ (tmp[1] & $0f) Shl 2 | (tmp[2] & $c0) Shr 6 ] )
  24. buf.Add( encode[ tmp[2] & $3f ] )
  25. j=0
  26. Endif
  27. Wend
  28. If j
  29. tmp[j]=0
  30. buf.Add( encode[ (tmp[0] & $fc) Shr 2 ] )
  31. buf.Add( encode[ (tmp[0] & $03) Shl 4 | (tmp[1] & $f0) Shr 4 ] )
  32. If j=2 buf.Add( encode[ (tmp[1] & $0f) Shl 2 | (tmp[2] & $c0) Shr 6 ] )
  33. If j=1 buf.Add( CHAR_EQUALS )
  34. buf.Add( CHAR_EQUALS )
  35. Endif
  36. Return String.FromCString( buf.Data.Data,buf.Length )
  37. End
  38. #rem monkeydoc Encode binary data to base64 text.
  39. #end
  40. Function EncodeBase64:String( data:DataBuffer )
  41. Return EncodeBase64( data.Data,data.Length )
  42. End
  43. #rem monkeydoc Decode base64 text to binary data.
  44. #end
  45. Function DecodeBase64:DataBuffer( str:String )
  46. Global decode:Int[]
  47. If Not decode
  48. decode=New Int[128]
  49. For Local i:=0 Until 128
  50. decode[i]=-1
  51. Next
  52. For Local i:=0 Until 64
  53. decode[encode[i]]=i
  54. Next
  55. Endif
  56. Local buf:=New Stack<UByte>,tmp:=New Int[4],i:=0,j:=0
  57. While i<str.Length
  58. Local c:=str[i]
  59. If c=CHAR_EQUALS Or c<0 Or c>=decode.Length Or decode[c]=-1 Exit
  60. tmp[j]=decode[c] ; i+=1 ; j+=1
  61. If j=4
  62. buf.Add( tmp[0] Shl 2 | (tmp[1] & $30) Shr 4 )
  63. buf.Add( (tmp[1] & $0f) Shl 4 | (tmp[2] & $3c) Shr 2)
  64. buf.Add( (tmp[2] & $03) Shl 6 | tmp[3] )
  65. j=0
  66. Endif
  67. Wend
  68. If j
  69. If j=1 Print "Base64 decode error"
  70. If j>1 buf.Add( tmp[0] Shl 2 | (tmp[1] & $30) Shr 4)
  71. If j>2 buf.Add( (tmp[1] & $0f) Shl 4 | (tmp[2] & $3c) Shr 2)
  72. Endif
  73. Local data:=New DataBuffer( buf.Length )
  74. libc.memcpy( data.Data,buf.Data.Data,buf.Length)
  75. Return data
  76. End