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
 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
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216

impl B64Encode<String,String> for B64<String>{
    fn encode(data:String)->String{
        let mut len_data:usize=data.len();
        let mut ptr_data:*const u8=data.as_ptr();
        let size:usize=len_data/3*4+if len_data%3==0 {0}else{4};
        let mut string:String=String::with_capacity(size);
        let mut d:u64;
        unsafe{
            let mut vector=&mut string.as_mut_vec();
            vector.resize(size,0);
            let mut pointer=vector.as_mut_ptr();
            let ptr_alphabet=ALPHABET64.as_ptr();
            while len_data>7{
                d=(*(ptr_data as *mut u64)).to_be();
                *pointer.offset(0)=*ptr_alphabet.offset(((d>>58)&0b111111) as isize);
                *pointer.offset(1)=*ptr_alphabet.offset(((d>>52)&0b111111) as isize);
                *pointer.offset(2)=*ptr_alphabet.offset(((d>>46)&0b111111) as isize);
                *pointer.offset(3)=*ptr_alphabet.offset(((d>>40)&0b111111) as isize);
                *pointer.offset(4)=*ptr_alphabet.offset(((d>>34)&0b111111) as isize);
                *pointer.offset(5)=*ptr_alphabet.offset(((d>>28)&0b111111) as isize);
                *pointer.offset(6)=*ptr_alphabet.offset(((d>>22)&0b111111) as isize);
                *pointer.offset(7)=*ptr_alphabet.offset(((d>>16)&0b111111) as isize);
                pointer=pointer.offset(8);
                ptr_data=ptr_data.offset(6);
                len_data-=6;
            }
            while len_data>2{
                *pointer.offset(0)=*ptr_alphabet.offset((*ptr_data.offset(0)>>2) as isize);
                *pointer.offset(1)=*ptr_alphabet.offset((((*ptr_data.offset(0)&0b11)<<4)|(*ptr_data.offset(1)>>4)) as isize);
                *pointer.offset(2)=*ptr_alphabet.offset((((*ptr_data.offset(1)&0b1111)<<2)|(*ptr_data.offset(2)>>6)) as isize);
                *pointer.offset(3)=*ptr_alphabet.offset((*ptr_data.offset(2)&0b111111) as isize);
                pointer=pointer.offset(4);
                ptr_data=ptr_data.offset(3);
                len_data-=3;
            }
            if len_data==2{
                *pointer.offset(0)=*ptr_alphabet.offset((*ptr_data>>2) as isize);
                *pointer.offset(1)=*ptr_alphabet.offset((((*ptr_data&0b11)<<4)|{ptr_data=ptr_data.offset(1);*ptr_data>>4}) as isize);
                *pointer.offset(2)=*ptr_alphabet.offset(((*ptr_data&0b1111)<<2) as isize);
                *pointer.offset(3)=61;
            }else{
                if len_data==1{
                    *pointer.offset(0)=*ptr_alphabet.offset((*ptr_data>>2) as isize);
                    *pointer.offset(1)=*ptr_alphabet.offset(((*ptr_data&0b11)<<4) as isize);
                    *pointer.offset(2)=61;
                    *pointer.offset(3)=61;
                }
            }
        }
        return string;
    }
}

impl B64Encode<&'static str,String> for B64<String>{
    fn encode(data:&'static str)->String{
        let mut len_data:usize=data.len();
        let mut ptr_data:*const u8=data.as_ptr();
        let size:usize=len_data/3*4+if len_data%3==0 {0}else{4};
        let mut string:String=String::with_capacity(size);
        let mut d:u64;
        unsafe{
            let mut vector=&mut string.as_mut_vec();
            vector.resize(size,0);
            let mut pointer=vector.as_mut_ptr();
            let ptr_alphabet=ALPHABET64.as_ptr();
            while len_data>7{
                d=(*(ptr_data as *mut u64)).to_be();
                *pointer.offset(0)=*ptr_alphabet.offset(((d>>58)&0b111111) as isize);
                *pointer.offset(1)=*ptr_alphabet.offset(((d>>52)&0b111111) as isize);
                *pointer.offset(2)=*ptr_alphabet.offset(((d>>46)&0b111111) as isize);
                *pointer.offset(3)=*ptr_alphabet.offset(((d>>40)&0b111111) as isize);
                *pointer.offset(4)=*ptr_alphabet.offset(((d>>34)&0b111111) as isize);
                *pointer.offset(5)=*ptr_alphabet.offset(((d>>28)&0b111111) as isize);
                *pointer.offset(6)=*ptr_alphabet.offset(((d>>22)&0b111111) as isize);
                *pointer.offset(7)=*ptr_alphabet.offset(((d>>16)&0b111111) as isize);
                pointer=pointer.offset(8);
                ptr_data=ptr_data.offset(6);
                len_data-=6;
            }
            while len_data>2{
                *pointer.offset(0)=*ptr_alphabet.offset((*ptr_data.offset(0)>>2) as isize);
                *pointer.offset(1)=*ptr_alphabet.offset((((*ptr_data.offset(0)&0b11)<<4)|(*ptr_data.offset(1)>>4)) as isize);
                *pointer.offset(2)=*ptr_alphabet.offset((((*ptr_data.offset(1)&0b1111)<<2)|(*ptr_data.offset(2)>>6)) as isize);
                *pointer.offset(3)=*ptr_alphabet.offset((*ptr_data.offset(2)&0b111111) as isize);
                pointer=pointer.offset(4);
                ptr_data=ptr_data.offset(3);
                len_data-=3;
            }
            if len_data==2{
                *pointer.offset(0)=*ptr_alphabet.offset((*ptr_data>>2) as isize);
                *pointer.offset(1)=*ptr_alphabet.offset((((*ptr_data&0b11)<<4)|{ptr_data=ptr_data.offset(1);*ptr_data>>4}) as isize);
                *pointer.offset(2)=*ptr_alphabet.offset(((*ptr_data&0b1111)<<2) as isize);
                *pointer.offset(3)=61;
            }else{
                if len_data==1{
                    *pointer.offset(0)=*ptr_alphabet.offset((*ptr_data>>2) as isize);
                    *pointer.offset(1)=*ptr_alphabet.offset(((*ptr_data&0b11)<<4) as isize);
                    *pointer.offset(2)=61;
                    *pointer.offset(3)=61;
                }
            }
        }
        return string;
    }
}

impl B64Decode<String,String> for B64<String>{
    fn decode(data:String)->String{
        let mut len_data:usize=data.len();
        let mut ptr_data:*const u8=data.as_ptr();
        let np:usize;
        unsafe{np=if len_data>2 {if *ptr_data.offset((len_data-2) as isize)==61 {2}else{if *ptr_data.offset((len_data-1) as isize)==61 {1}else{0}}}else{0};}
        let size:usize=len_data/4*3-np;
        let mut string:String=String::with_capacity(size);
        unsafe{
            let mut vector=&mut string.as_mut_vec();
            vector.resize(size,0);
            let mut pointer=vector.as_mut_ptr();
            let ptr_alphabet=_ALPHABET64.as_ptr();
            while len_data>8{
                *pointer.offset(0)=*ptr_alphabet.offset(*ptr_data.offset(0) as isize)<<2|*ptr_alphabet.offset(*ptr_data.offset(1) as isize)>>4;
                *pointer.offset(1)=*ptr_alphabet.offset(*ptr_data.offset(1) as isize)<<4|*ptr_alphabet.offset(*ptr_data.offset(2) as isize)>>2;
                *pointer.offset(2)=*ptr_alphabet.offset(*ptr_data.offset(2) as isize)<<6|*ptr_alphabet.offset(*ptr_data.offset(3) as isize)>>0;
                *pointer.offset(3)=*ptr_alphabet.offset(*ptr_data.offset(4) as isize)<<2|*ptr_alphabet.offset(*ptr_data.offset(5) as isize)>>4;
                *pointer.offset(4)=*ptr_alphabet.offset(*ptr_data.offset(5) as isize)<<4|*ptr_alphabet.offset(*ptr_data.offset(6) as isize)>>2;
                *pointer.offset(5)=*ptr_alphabet.offset(*ptr_data.offset(6) as isize)<<6|*ptr_alphabet.offset(*ptr_data.offset(7) as isize)>>0;
                pointer=pointer.offset(6);
                ptr_data=ptr_data.offset(8);
                len_data-=8;
            }
            while len_data>3{
                if len_data>4{
                    *pointer.offset(0)=*ptr_alphabet.offset(*ptr_data.offset(0) as isize)<<2|*ptr_alphabet.offset(*ptr_data.offset(1) as isize)>>4;
                    *pointer.offset(1)=*ptr_alphabet.offset(*ptr_data.offset(1) as isize)<<4|*ptr_alphabet.offset(*ptr_data.offset(2) as isize)>>2;
                    *pointer.offset(2)=*ptr_alphabet.offset(*ptr_data.offset(2) as isize)<<6|*ptr_alphabet.offset(*ptr_data.offset(3) as isize)>>0;
                    pointer=pointer.offset(3);
                    ptr_data=ptr_data.offset(4);
                    len_data-=4;
                }else{
                    if np==0{
                        *pointer.offset(0)=*ptr_alphabet.offset(*ptr_data.offset(0) as isize)<<2|*ptr_alphabet.offset(*ptr_data.offset(1) as isize)>>4;
                        *pointer.offset(1)=*ptr_alphabet.offset(*ptr_data.offset(1) as isize)<<4|*ptr_alphabet.offset(*ptr_data.offset(2) as isize)>>2;
                        *pointer.offset(2)=*ptr_alphabet.offset(*ptr_data.offset(2) as isize)<<6|*ptr_alphabet.offset(*ptr_data.offset(3) as isize)>>0;
                    }else{
                        if np==1{
                            *pointer.offset(0)=*ptr_alphabet.offset(*ptr_data.offset(0) as isize)<<2|*ptr_alphabet.offset(*ptr_data.offset(1) as isize)>>4;
                            *pointer.offset(1)=*ptr_alphabet.offset(*ptr_data.offset(1) as isize)<<4|*ptr_alphabet.offset(*ptr_data.offset(2) as isize)>>2;
                        }else{
                            if np==2{
                                *pointer.offset(0)=*ptr_alphabet.offset(*ptr_data.offset(0) as isize)<<2|*ptr_alphabet.offset(*ptr_data.offset(1) as isize)>>4;
                            }
                        }
                    }
                    len_data-=4;
                }
            }
        }
        return string;
    }
}

impl B64Decode<&'static str,String> for B64<String>{
    fn decode(data:&'static str)->String{
        let mut len_data:usize=data.len();
        let mut ptr_data:*const u8=data.as_ptr();
        let np:usize;
        unsafe{np=if len_data>2 {if *ptr_data.offset((len_data-2) as isize)==61 {2}else{if *ptr_data.offset((len_data-1) as isize)==61 {1}else{0}}}else{0};}
        let size:usize=len_data/4*3-np;
        let mut string:String=String::with_capacity(size);
        unsafe{
            let mut vector=&mut string.as_mut_vec();
            vector.resize(size,0);
            let mut pointer=vector.as_mut_ptr();
            let ptr_alphabet=_ALPHABET64.as_ptr();
            while len_data>8{
                *pointer.offset(0)=*ptr_alphabet.offset(*ptr_data.offset(0) as isize)<<2|*ptr_alphabet.offset(*ptr_data.offset(1) as isize)>>4;
                *pointer.offset(1)=*ptr_alphabet.offset(*ptr_data.offset(1) as isize)<<4|*ptr_alphabet.offset(*ptr_data.offset(2) as isize)>>2;
                *pointer.offset(2)=*ptr_alphabet.offset(*ptr_data.offset(2) as isize)<<6|*ptr_alphabet.offset(*ptr_data.offset(3) as isize)>>0;
                *pointer.offset(3)=*ptr_alphabet.offset(*ptr_data.offset(4) as isize)<<2|*ptr_alphabet.offset(*ptr_data.offset(5) as isize)>>4;
                *pointer.offset(4)=*ptr_alphabet.offset(*ptr_data.offset(5) as isize)<<4|*ptr_alphabet.offset(*ptr_data.offset(6) as isize)>>2;
                *pointer.offset(5)=*ptr_alphabet.offset(*ptr_data.offset(6) as isize)<<6|*ptr_alphabet.offset(*ptr_data.offset(7) as isize)>>0;
                pointer=pointer.offset(6);
                ptr_data=ptr_data.offset(8);
                len_data-=8;
            }
            while len_data>3{
                if len_data>4{
                    *pointer.offset(0)=*ptr_alphabet.offset(*ptr_data.offset(0) as isize)<<2|*ptr_alphabet.offset(*ptr_data.offset(1) as isize)>>4;
                    *pointer.offset(1)=*ptr_alphabet.offset(*ptr_data.offset(1) as isize)<<4|*ptr_alphabet.offset(*ptr_data.offset(2) as isize)>>2;
                    *pointer.offset(2)=*ptr_alphabet.offset(*ptr_data.offset(2) as isize)<<6|*ptr_alphabet.offset(*ptr_data.offset(3) as isize)>>0;
                    pointer=pointer.offset(3);
                    ptr_data=ptr_data.offset(4);
                    len_data-=4;
                }else{
                    if np==0{
                        *pointer.offset(0)=*ptr_alphabet.offset(*ptr_data.offset(0) as isize)<<2|*ptr_alphabet.offset(*ptr_data.offset(1) as isize)>>4;
                        *pointer.offset(1)=*ptr_alphabet.offset(*ptr_data.offset(1) as isize)<<4|*ptr_alphabet.offset(*ptr_data.offset(2) as isize)>>2;
                        *pointer.offset(2)=*ptr_alphabet.offset(*ptr_data.offset(2) as isize)<<6|*ptr_alphabet.offset(*ptr_data.offset(3) as isize)>>0;
                    }else{
                        if np==1{
                            *pointer.offset(0)=*ptr_alphabet.offset(*ptr_data.offset(0) as isize)<<2|*ptr_alphabet.offset(*ptr_data.offset(1) as isize)>>4;
                            *pointer.offset(1)=*ptr_alphabet.offset(*ptr_data.offset(1) as isize)<<4|*ptr_alphabet.offset(*ptr_data.offset(2) as isize)>>2;
                        }else{
                            if np==2{
                                *pointer.offset(0)=*ptr_alphabet.offset(*ptr_data.offset(0) as isize)<<2|*ptr_alphabet.offset(*ptr_data.offset(1) as isize)>>4;
                            }
                        }
                    }
                    len_data-=4;
                }
            }
        }
        return string;
    }
}