source: Dev/trunk/src/client/dojox/encoding/digests/_base.js

Last change on this file was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 3.0 KB
Line 
1define(["dojo/_base/lang"], function(lang){
2        //      These functions are 32-bit word-based.  See _sha-64 for 64-bit word ops.
3        var base = lang.getObject("dojox.encoding.digests", true);
4
5        base.outputTypes={
6                // summary:
7                //              Enumeration for input and output encodings.
8                Base64:0, Hex:1, String:2, Raw:3
9        };
10
11        //      word-based addition
12        base.addWords=function(/* word */a, /* word */b){
13                // summary:
14                //              add a pair of words together with rollover
15                var l=(a&0xFFFF)+(b&0xFFFF);
16                var m=(a>>16)+(b>>16)+(l>>16);
17                return (m<<16)|(l&0xFFFF);      //      word
18        };
19
20        //      word-based conversion method, for efficiency sake;
21        //      most digests operate on words, and this should be faster
22        //      than the encoding version (which works on bytes).
23        var chrsz=8;    //      16 for Unicode
24        var mask=(1<<chrsz)-1;
25
26        base.stringToWord=function(/* string */s){
27                // summary:
28                //              convert a string to a word array
29                var wa=[];
30                for(var i=0, l=s.length*chrsz; i<l; i+=chrsz){
31                        wa[i>>5]|=(s.charCodeAt(i/chrsz)&mask)<<(i%32);
32                }
33                return wa;      //      word[]
34        };
35
36        base.wordToString=function(/* word[] */wa){
37                // summary:
38                //              convert an array of words to a string
39                var s=[];
40                for(var i=0, l=wa.length*32; i<l; i+=chrsz){
41                        s.push(String.fromCharCode((wa[i>>5]>>>(i%32))&mask));
42                }
43                return s.join("");      //      string
44        };
45
46        base.wordToHex=function(/* word[] */wa){
47                // summary:
48                //              convert an array of words to a hex tab
49                var h="0123456789abcdef", s=[];
50                for(var i=0, l=wa.length*4; i<l; i++){
51                        s.push(h.charAt((wa[i>>2]>>((i%4)*8+4))&0xF)+h.charAt((wa[i>>2]>>((i%4)*8))&0xF));
52                }
53                return s.join("");      //      string
54        };
55
56        base.wordToBase64=function(/* word[] */wa){
57                // summary:
58                //              convert an array of words to base64 encoding, should be more efficient
59                //              than using dojox.encoding.base64
60                var p="=", tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", s=[];
61                for(var i=0, l=wa.length*4; i<l; i+=3){
62                        var t=(((wa[i>>2]>>8*(i%4))&0xFF)<<16)|(((wa[i+1>>2]>>8*((i+1)%4))&0xFF)<<8)|((wa[i+2>>2]>>8*((i+2)%4))&0xFF);
63                        for(var j=0; j<4; j++){
64                                if(i*8+j*6>wa.length*32){
65                                        s.push(p);
66                                } else {
67                                        s.push(tab.charAt((t>>6*(3-j))&0x3F));
68                                }
69                        }
70                }
71                return s.join("");      //      string
72        };
73
74        //      convert to UTF-8
75        base.stringToUtf8 = function(input){
76                var output = "";
77                var i = -1;
78                var x, y;
79
80                while(++i < input.length){
81                        x = input.charCodeAt(i);
82                        y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
83                        if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF){
84                                x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
85                                i++;
86                        }
87
88                        if(x <= 0x7F)
89                                output += String.fromCharCode(x);
90                        else if(x <= 0x7FF)
91                                output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F), 0x80 | (x & 0x3F));
92                        else if(x <= 0xFFFF)
93                                output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F), 0x80 | ((x >>> 6) & 0x3F), 0x80 | (x & 0x3F));
94                        else if(x <= 0x1FFFFF)
95                                output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07), 0x80 | ((x >>> 12) & 0x3F), 0x80 | ((x >>> 6) & 0x3F), 0x80 | (x & 0x3F));
96                }
97                return output;
98        };
99
100        return base;
101});
Note: See TracBrowser for help on using the repository browser.