1*37da2899SCharles.Forsythimplement Encoding; 2*37da2899SCharles.Forsyth 3*37da2899SCharles.Forsythinclude "encoding.m"; 4*37da2899SCharles.Forsyth 5*37da2899SCharles.Forsythenc(a: array of byte) : string 6*37da2899SCharles.Forsyth{ 7*37da2899SCharles.Forsyth n := len a; 8*37da2899SCharles.Forsyth if(n == 0) 9*37da2899SCharles.Forsyth return ""; 10*37da2899SCharles.Forsyth out := ""; 11*37da2899SCharles.Forsyth j := 0; 12*37da2899SCharles.Forsyth i := 0; 13*37da2899SCharles.Forsyth while(i < n) { 14*37da2899SCharles.Forsyth x := int a[i++] << 16; 15*37da2899SCharles.Forsyth if(i < n) 16*37da2899SCharles.Forsyth x |= (int a[i++]&255) << 8; 17*37da2899SCharles.Forsyth if(i < n) 18*37da2899SCharles.Forsyth x |= (int a[i++]&255); 19*37da2899SCharles.Forsyth out[j++] = c64(x>>18); 20*37da2899SCharles.Forsyth out[j++] = c64(x>>12); 21*37da2899SCharles.Forsyth out[j++] = c64(x>> 6); 22*37da2899SCharles.Forsyth out[j++] = c64(x); 23*37da2899SCharles.Forsyth } 24*37da2899SCharles.Forsyth nmod3 := n % 3; 25*37da2899SCharles.Forsyth if(nmod3 != 0) { 26*37da2899SCharles.Forsyth out[j-1] = '='; 27*37da2899SCharles.Forsyth if(nmod3 == 1) 28*37da2899SCharles.Forsyth out[j-2] = '='; 29*37da2899SCharles.Forsyth } 30*37da2899SCharles.Forsyth return out; 31*37da2899SCharles.Forsyth} 32*37da2899SCharles.Forsyth 33*37da2899SCharles.Forsythc64(c: int) : int 34*37da2899SCharles.Forsyth{ 35*37da2899SCharles.Forsyth v: con "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 36*37da2899SCharles.Forsyth return v[c&63]; 37*37da2899SCharles.Forsyth} 38*37da2899SCharles.Forsyth 39*37da2899SCharles.ForsythINVAL: con byte 255; 40*37da2899SCharles.Forsyth 41*37da2899SCharles.Forsytht64d := array[256] of { 42*37da2899SCharles.Forsyth INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, 43*37da2899SCharles.Forsyth INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, 44*37da2899SCharles.Forsyth INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, byte 62,INVAL,INVAL,INVAL, byte 63, 45*37da2899SCharles.Forsyth byte 52, byte 53, byte 54, byte 55, byte 56, byte 57, byte 58, byte 59, byte 60, byte 61,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, 46*37da2899SCharles.Forsyth INVAL, byte 0, byte 1, byte 2, byte 3, byte 4, byte 5, byte 6, byte 7, byte 8, byte 9, byte 10, byte 11, byte 12, byte 13, byte 14, 47*37da2899SCharles.Forsyth byte 15, byte 16, byte 17, byte 18, byte 19, byte 20, byte 21, byte 22, byte 23, byte 24, byte 25,INVAL,INVAL,INVAL,INVAL,INVAL, 48*37da2899SCharles.Forsyth INVAL, byte 26, byte 27, byte 28, byte 29, byte 30, byte 31, byte 32, byte 33, byte 34, byte 35, byte 36, byte 37, byte 38, byte 39, byte 40, 49*37da2899SCharles.Forsyth byte 41, byte 42, byte 43, byte 44, byte 45, byte 46, byte 47, byte 48, byte 49, byte 50, byte 51,INVAL,INVAL,INVAL,INVAL,INVAL, 50*37da2899SCharles.Forsyth INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, 51*37da2899SCharles.Forsyth INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, 52*37da2899SCharles.Forsyth INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, 53*37da2899SCharles.Forsyth INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, 54*37da2899SCharles.Forsyth INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, 55*37da2899SCharles.Forsyth INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, 56*37da2899SCharles.Forsyth INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, 57*37da2899SCharles.Forsyth INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL 58*37da2899SCharles.Forsyth}; 59*37da2899SCharles.Forsyth 60*37da2899SCharles.Forsythdec(s: string): array of byte 61*37da2899SCharles.Forsyth{ 62*37da2899SCharles.Forsyth b24 := 0; 63*37da2899SCharles.Forsyth i := 0; 64*37da2899SCharles.Forsyth out := array[(3*len s+3)/4] of byte; # upper bound, especially if s contains white space 65*37da2899SCharles.Forsyth o := 0; 66*37da2899SCharles.Forsyth for(n := 0; n < len s; n++){ 67*37da2899SCharles.Forsyth if((c := s[n]) > 16rFF || (c = int t64d[c]) == int INVAL) 68*37da2899SCharles.Forsyth continue; 69*37da2899SCharles.Forsyth case i++ { 70*37da2899SCharles.Forsyth 0 => 71*37da2899SCharles.Forsyth b24 = c<<18; 72*37da2899SCharles.Forsyth 1 => 73*37da2899SCharles.Forsyth b24 |= c<<12; 74*37da2899SCharles.Forsyth 2 => 75*37da2899SCharles.Forsyth b24 |= c<<6; 76*37da2899SCharles.Forsyth 3 => 77*37da2899SCharles.Forsyth b24 |= c; 78*37da2899SCharles.Forsyth out[o++] = byte (b24>>16); 79*37da2899SCharles.Forsyth out[o++] = byte (b24>>8); 80*37da2899SCharles.Forsyth out[o++] = byte b24; 81*37da2899SCharles.Forsyth i = 0; 82*37da2899SCharles.Forsyth } 83*37da2899SCharles.Forsyth } 84*37da2899SCharles.Forsyth case i { 85*37da2899SCharles.Forsyth 2 => 86*37da2899SCharles.Forsyth out[o++] = byte (b24>>16); 87*37da2899SCharles.Forsyth 3 => 88*37da2899SCharles.Forsyth out[o++] = byte (b24>>16); 89*37da2899SCharles.Forsyth out[o++] = byte (b24>>8); 90*37da2899SCharles.Forsyth } 91*37da2899SCharles.Forsyth return out[0:o]; 92*37da2899SCharles.Forsyth} 93