Javascript SHA-1: 보안 해시 알고리즘_기본
<span class="comment">/* * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined * in FIPS PUB 180-1 * Version 2.1a Copyright Paul Johnston 2000 - 2002. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * Distributed under the BSD License * See http://pajhome.org.uk/crypt/md5 for details. */</span> <span class="comment">/* * Configurable variables. You may need to tweak these to be compatible with * the server-side, but the defaults work in most cases. */</span> <span class="reserved_word">var</span> hexcase <span class="symbol">=</span> <span class="numeric">0</span><span class="symbol">;</span> <span class="comment">/* hex output format. 0 - lowercase; 1 - uppercase */</span> <span class="reserved_word">var</span> b64pad <span class="symbol">=</span> <span class="string">""</span><span class="symbol">;</span> <span class="comment">/* base-64 pad character. "=" for strict RFC compliance */</span> <span class="reserved_word">var</span> chrsz <span class="symbol">=</span> <span class="numeric">8</span><span class="symbol">;</span> <span class="comment">/* bits per input character. 8 - ASCII; 16 - Unicode */</span> <span class="comment">/* * These are the functions you'll usually want to call * They take string arguments and return either hex or base-64 encoded strings */</span> <span class="reserved_word">function</span> hex_sha1<span class="braces">(</span>s<span class="braces">)</span><span class="braces">{</span><span class="reserved_word">return</span> binb2hex<span class="braces">(</span>core_sha1<span class="braces">(</span>str2binb<span class="braces">(</span>s<span class="braces">)</span>,s.<span class="predefined_identifier">length</span> * chrsz<span class="braces">)</span><span class="braces">)</span><span class="symbol">;</span><span class="braces">}</span> <span class="reserved_word">function</span> b64_sha1<span class="braces">(</span>s<span class="braces">)</span><span class="braces">{</span><span class="reserved_word">return</span> binb2b64<span class="braces">(</span>core_sha1<span class="braces">(</span>str2binb<span class="braces">(</span>s<span class="braces">)</span>,s.<span class="predefined_identifier">length</span> * chrsz<span class="braces">)</span><span class="braces">)</span><span class="symbol">;</span><span class="braces">}</span> <span class="reserved_word">function</span> str_sha1<span class="braces">(</span>s<span class="braces">)</span><span class="braces">{</span><span class="reserved_word">return</span> binb2str<span class="braces">(</span>core_sha1<span class="braces">(</span>str2binb<span class="braces">(</span>s<span class="braces">)</span>,s.<span class="predefined_identifier">length</span> * chrsz<span class="braces">)</span><span class="braces">)</span><span class="symbol">;</span><span class="braces">}</span> <span class="reserved_word">function</span> hex_hmac_sha1<span class="braces">(</span>key, data<span class="braces">)</span><span class="braces">{</span> <span class="reserved_word">return</span> binb2hex<span class="braces">(</span>core_hmac_sha1<span class="braces">(</span>key, data<span class="braces">)</span><span class="braces">)</span><span class="symbol">;</span><span class="braces">}</span> <span class="reserved_word">function</span> b64_hmac_sha1<span class="braces">(</span>key, data<span class="braces">)</span><span class="braces">{</span> <span class="reserved_word">return</span> binb2b64<span class="braces">(</span>core_hmac_sha1<span class="braces">(</span>key, data<span class="braces">)</span><span class="braces">)</span><span class="symbol">;</span><span class="braces">}</span> <span class="reserved_word">function</span> str_hmac_sha1<span class="braces">(</span>key, data<span class="braces">)</span><span class="braces">{</span> <span class="reserved_word">return</span> binb2str<span class="braces">(</span>core_hmac_sha1<span class="braces">(</span>key, data<span class="braces">)</span><span class="braces">)</span><span class="symbol">;</span><span class="braces">}</span> <span class="comment">/* * Perform a simple self-test to see if the VM is working */</span> <span class="reserved_word">function</span> sha1_vm_test<span class="braces">(</span><span class="braces">)</span> <span class="braces">{</span> <span class="reserved_word">return</span> hex_sha1<span class="braces">(</span><span class="string">"abc"</span><span class="braces">)</span> <span class="symbol">=</span><span class="symbol">=</span> <span class="string">"a9993e364706816aba3e25717850c26c9cd0d89d"</span><span class="symbol">;</span> <span class="braces">}</span> <span class="comment">/* * Calculate the SHA-1 of an array of big-endian words, and a bit length */</span> <span class="reserved_word">function</span> core_sha1<span class="braces">(</span>x, len<span class="braces">)</span> <span class="braces">{</span> <span class="comment">/* append padding */</span> x[len <span class="symbol">></span><span class="symbol">></span> <span class="numeric">5</span>] <span class="symbol">|</span><span class="symbol">=</span> <span class="numeric">0x80</span> <span class="symbol"><</SPAN><SPAN class=symbol><</SPAN> <SPAN class=braces>(</SPAN><SPAN class=numeric>24</SPAN> - len % <SPAN class=numeric>32</SPAN><SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> x[<SPAN class=braces>(</SPAN><SPAN class=braces>(</SPAN>len + <SPAN class=numeric>64</SPAN> <SPAN class=symbol>></span><span class="symbol">></span> <span class="numeric">9</span><span class="braces">)</span> <span class="symbol"><</SPAN><SPAN class=symbol><</SPAN> <SPAN class=numeric>4</SPAN><SPAN class=braces>)</SPAN> + <SPAN class=numeric>15</SPAN>] <SPAN class=symbol>=</SPAN> len<SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>var</SPAN> w <SPAN class=symbol>=</SPAN> <SPAN class=predefined_type>Array</SPAN><SPAN class=braces>(</SPAN><SPAN class=numeric>80</SPAN><SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>var</SPAN> a <SPAN class=symbol>=</SPAN> <SPAN class=numeric>1732584193</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>var</SPAN> b <SPAN class=symbol>=</SPAN> -<SPAN class=numeric>271733879</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>var</SPAN> c <SPAN class=symbol>=</SPAN> -<SPAN class=numeric>1732584194</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>var</SPAN> d <SPAN class=symbol>=</SPAN> <SPAN class=numeric>271733878</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>var</SPAN> e <SPAN class=symbol>=</SPAN> -<SPAN class=numeric>1009589776</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>for</SPAN><SPAN class=braces>(</SPAN><SPAN class=reserved_word>var</SPAN> i <SPAN class=symbol>=</SPAN> <SPAN class=numeric>0</SPAN><SPAN class=symbol>;</SPAN> i <SPAN class=symbol><</SPAN> x.<SPAN class=predefined_identifier>length</SPAN><SPAN class=symbol>;</SPAN> i +<SPAN class=symbol>=</SPAN> <SPAN class=numeric>16</SPAN><SPAN class=braces>)</SPAN> <SPAN class=braces>{</SPAN> <SPAN class=reserved_word>var</SPAN> olda <SPAN class=symbol>=</SPAN> a<SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>var</SPAN> oldb <SPAN class=symbol>=</SPAN> b<SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>var</SPAN> oldc <SPAN class=symbol>=</SPAN> c<SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>var</SPAN> oldd <SPAN class=symbol>=</SPAN> d<SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>var</SPAN> olde <SPAN class=symbol>=</SPAN> e<SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>for</SPAN><SPAN class=braces>(</SPAN><SPAN class=reserved_word>var</SPAN> j <SPAN class=symbol>=</SPAN> <SPAN class=numeric>0</SPAN><SPAN class=symbol>;</SPAN> j <SPAN class=symbol><</SPAN> <SPAN class=numeric>80</SPAN><SPAN class=symbol>;</SPAN> j++<SPAN class=braces>)</SPAN> <SPAN class=braces>{</SPAN> <SPAN class=reserved_word>if</SPAN><SPAN class=braces>(</SPAN>j <SPAN class=symbol><</SPAN> <SPAN class=numeric>16</SPAN><SPAN class=braces>)</SPAN> w[j] <SPAN class=symbol>=</SPAN> x[i + j]<SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>else</SPAN> w[j] <SPAN class=symbol>=</SPAN> rol<SPAN class=braces>(</SPAN>w[j-<SPAN class=numeric>3</SPAN>] ^ w[j-<SPAN class=numeric>8</SPAN>] ^ w[j-<SPAN class=numeric>14</SPAN>] ^ w[j-<SPAN class=numeric>16</SPAN>], <SPAN class=numeric>1</SPAN><SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>var</SPAN> t <SPAN class=symbol>=</SPAN> safe_add<SPAN class=braces>(</SPAN>safe_add<SPAN class=braces>(</SPAN>rol<SPAN class=braces>(</SPAN>a, <SPAN class=numeric>5</SPAN><SPAN class=braces>)</SPAN>, sha1_ft<SPAN class=braces>(</SPAN>j, b, c, d<SPAN class=braces>)</SPAN><SPAN class=braces>)</SPAN>, safe_add<SPAN class=braces>(</SPAN>safe_add<SPAN class=braces>(</SPAN>e, w[j]<SPAN class=braces>)</SPAN>, sha1_kt<SPAN class=braces>(</SPAN>j<SPAN class=braces>)</SPAN><SPAN class=braces>)</SPAN><SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> e <SPAN class=symbol>=</SPAN> d<SPAN class=symbol>;</SPAN> d <SPAN class=symbol>=</SPAN> c<SPAN class=symbol>;</SPAN> c <SPAN class=symbol>=</SPAN> rol<SPAN class=braces>(</SPAN>b, <SPAN class=numeric>30</SPAN><SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> b <SPAN class=symbol>=</SPAN> a<SPAN class=symbol>;</SPAN> a <SPAN class=symbol>=</SPAN> t<SPAN class=symbol>;</SPAN> <SPAN class=braces>}</SPAN> a <SPAN class=symbol>=</SPAN> safe_add<SPAN class=braces>(</SPAN>a, olda<SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> b <SPAN class=symbol>=</SPAN> safe_add<SPAN class=braces>(</SPAN>b, oldb<SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> c <SPAN class=symbol>=</SPAN> safe_add<SPAN class=braces>(</SPAN>c, oldc<SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> d <SPAN class=symbol>=</SPAN> safe_add<SPAN class=braces>(</SPAN>d, oldd<SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> e <SPAN class=symbol>=</SPAN> safe_add<SPAN class=braces>(</SPAN>e, olde<SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=braces>}</SPAN> <SPAN class=reserved_word>return</SPAN> <SPAN class=predefined_type>Array</SPAN><SPAN class=braces>(</SPAN>a, b, c, d, e<SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=braces>}</SPAN> <SPAN class=comment>/* * Perform the appropriate triplet combination function for the current * iteration */</SPAN> <SPAN class=reserved_word>function</SPAN> sha1_ft<SPAN class=braces>(</SPAN>t, b, c, d<SPAN class=braces>)</SPAN> <SPAN class=braces>{</SPAN> <SPAN class=reserved_word>if</SPAN><SPAN class=braces>(</SPAN>t <SPAN class=symbol><</SPAN> <SPAN class=numeric>20</SPAN><SPAN class=braces>)</SPAN> <SPAN class=reserved_word>return</SPAN> <SPAN class=braces>(</SPAN>b <SPAN class=symbol>&</SPAN> c<SPAN class=braces>)</SPAN> <SPAN class=symbol>|</SPAN> <SPAN class=braces>(</SPAN><SPAN class=braces>(</SPAN>~b<SPAN class=braces>)</SPAN> <SPAN class=symbol>&</SPAN> d<SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>if</SPAN><SPAN class=braces>(</SPAN>t <SPAN class=symbol><</SPAN> <SPAN class=numeric>40</SPAN><SPAN class=braces>)</SPAN> <SPAN class=reserved_word>return</SPAN> b ^ c ^ d<SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>if</SPAN><SPAN class=braces>(</SPAN>t <SPAN class=symbol><</SPAN> <SPAN class=numeric>60</SPAN><SPAN class=braces>)</SPAN> <SPAN class=reserved_word>return</SPAN> <SPAN class=braces>(</SPAN>b <SPAN class=symbol>&</SPAN> c<SPAN class=braces>)</SPAN> <SPAN class=symbol>|</SPAN> <SPAN class=braces>(</SPAN>b <SPAN class=symbol>&</SPAN> d<SPAN class=braces>)</SPAN> <SPAN class=symbol>|</SPAN> <SPAN class=braces>(</SPAN>c <SPAN class=symbol>&</SPAN> d<SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>return</SPAN> b ^ c ^ d<SPAN class=symbol>;</SPAN> <SPAN class=braces>}</SPAN> <SPAN class=comment>/* * Determine the appropriate additive constant for the current iteration */</SPAN> <SPAN class=reserved_word>function</SPAN> sha1_kt<SPAN class=braces>(</SPAN>t<SPAN class=braces>)</SPAN> <SPAN class=braces>{</SPAN> <SPAN class=reserved_word>return</SPAN> <SPAN class=braces>(</SPAN>t <SPAN class=symbol><</SPAN> <SPAN class=numeric>20</SPAN><SPAN class=braces>)</SPAN> ? <SPAN class=numeric>1518500249</SPAN> : <SPAN class=braces>(</SPAN>t <SPAN class=symbol><</SPAN> <SPAN class=numeric>40</SPAN><SPAN class=braces>)</SPAN> ? <SPAN class=numeric>1859775393</SPAN> : <SPAN class=braces>(</SPAN>t <SPAN class=symbol><</SPAN> <SPAN class=numeric>60</SPAN><SPAN class=braces>)</SPAN> ? -<SPAN class=numeric>1894007588</SPAN> : -<SPAN class=numeric>899497514</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=braces>}</SPAN> <SPAN class=comment>/* * Calculate the HMAC-SHA1 of a key and some data */</SPAN> <SPAN class=reserved_word>function</SPAN> core_hmac_sha1<SPAN class=braces>(</SPAN>key, data<SPAN class=braces>)</SPAN> <SPAN class=braces>{</SPAN> <SPAN class=reserved_word>var</SPAN> bkey <SPAN class=symbol>=</SPAN> str2binb<SPAN class=braces>(</SPAN>key<SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>if</SPAN><SPAN class=braces>(</SPAN>bkey.<SPAN class=predefined_identifier>length</SPAN> <SPAN class=symbol>></span> <span class="numeric">16</span><span class="braces">)</span> bkey <span class="symbol">=</span> core_sha1<span class="braces">(</span>bkey, key.<span class="predefined_identifier">length</span> * chrsz<span class="braces">)</span><span class="symbol">;</span> <span class="reserved_word">var</span> ipad <span class="symbol">=</span> <span class="predefined_type">Array</span><span class="braces">(</span><span class="numeric">16</span><span class="braces">)</span>, opad <span class="symbol">=</span> <span class="predefined_type">Array</span><span class="braces">(</span><span class="numeric">16</span><span class="braces">)</span><span class="symbol">;</span> <span class="reserved_word">for</span><span class="braces">(</span><span class="reserved_word">var</span> i <span class="symbol">=</span> <span class="numeric">0</span><span class="symbol">;</span> i <span class="symbol"><</SPAN> <SPAN class=numeric>16</SPAN><SPAN class=symbol>;</SPAN> i++<SPAN class=braces>)</SPAN> <SPAN class=braces>{</SPAN> ipad[i] <SPAN class=symbol>=</SPAN> bkey[i] ^ <SPAN class=numeric>0x36363636</SPAN><SPAN class=symbol>;</SPAN> opad[i] <SPAN class=symbol>=</SPAN> bkey[i] ^ <SPAN class=numeric>0x5C5C5C5C</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=braces>}</SPAN> <SPAN class=reserved_word>var</SPAN> <SPAN class=predefined_identifier>hash</SPAN> <SPAN class=symbol>=</SPAN> core_sha1<SPAN class=braces>(</SPAN>ipad.concat<SPAN class=braces>(</SPAN>str2binb<SPAN class=braces>(</SPAN>data<SPAN class=braces>)</SPAN><SPAN class=braces>)</SPAN>, <SPAN class=numeric>512</SPAN> + data.<SPAN class=predefined_identifier>length</SPAN> * chrsz<SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>return</SPAN> core_sha1<SPAN class=braces>(</SPAN>opad.concat<SPAN class=braces>(</SPAN><SPAN class=predefined_identifier>hash</SPAN><SPAN class=braces>)</SPAN>, <SPAN class=numeric>512</SPAN> + <SPAN class=numeric>160</SPAN><SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=braces>}</SPAN> <SPAN class=comment>/* * Add integers, wrapping at 2^32. This uses 16-bit operations internally * to work around bugs in some JS interpreters. */</SPAN> <SPAN class=reserved_word>function</SPAN> safe_add<SPAN class=braces>(</SPAN>x, y<SPAN class=braces>)</SPAN> <SPAN class=braces>{</SPAN> <SPAN class=reserved_word>var</SPAN> lsw <SPAN class=symbol>=</SPAN> <SPAN class=braces>(</SPAN>x <SPAN class=symbol>&</SPAN> <SPAN class=numeric>0xFFFF</SPAN><SPAN class=braces>)</SPAN> + <SPAN class=braces>(</SPAN>y <SPAN class=symbol>&</SPAN> <SPAN class=numeric>0xFFFF</SPAN><SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>var</SPAN> msw <SPAN class=symbol>=</SPAN> <SPAN class=braces>(</SPAN>x <SPAN class=symbol>></span><span class="symbol">></span> <span class="numeric">16</span><span class="braces">)</span> + <span class="braces">(</span>y <span class="symbol">></span><span class="symbol">></span> <span class="numeric">16</span><span class="braces">)</span> + <span class="braces">(</span>lsw <span class="symbol">></span><span class="symbol">></span> <span class="numeric">16</span><span class="braces">)</span><span class="symbol">;</span> <span class="reserved_word">return</span> <span class="braces">(</span>msw <span class="symbol"><</SPAN><SPAN class=symbol><</SPAN> <SPAN class=numeric>16</SPAN><SPAN class=braces>)</SPAN> <SPAN class=symbol>|</SPAN> <SPAN class=braces>(</SPAN>lsw <SPAN class=symbol>&</SPAN> <SPAN class=numeric>0xFFFF</SPAN><SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=braces>}</SPAN> <SPAN class=comment>/* * Bitwise rotate a 32-bit number to the left. */</SPAN> <SPAN class=reserved_word>function</SPAN> rol<SPAN class=braces>(</SPAN>num, cnt<SPAN class=braces>)</SPAN> <SPAN class=braces>{</SPAN> <SPAN class=reserved_word>return</SPAN> <SPAN class=braces>(</SPAN>num <SPAN class=symbol><</SPAN><SPAN class=symbol><</SPAN> cnt<SPAN class=braces>)</SPAN> <SPAN class=symbol>|</SPAN> <SPAN class=braces>(</SPAN>num <SPAN class=symbol>></span><span class="symbol">></span><span class="symbol">></span> <span class="braces">(</span><span class="numeric">32</span> - cnt<span class="braces">)</span><span class="braces">)</span><span class="symbol">;</span> <span class="braces">}</span> <span class="comment">/* * Convert an 8-bit or 16-bit string to an array of big-endian words * In 8-bit function, characters >255 have their hi-byte silently ignored. */</span> <span class="reserved_word">function</span> str2binb<span class="braces">(</span>str<span class="braces">)</span> <span class="braces">{</span> <span class="reserved_word">var</span> bin <span class="symbol">=</span> <span class="predefined_type">Array</span><span class="braces">(</span><span class="braces">)</span><span class="symbol">;</span> <span class="reserved_word">var</span> mask <span class="symbol">=</span> <span class="braces">(</span><span class="numeric">1</span> <span class="symbol"><</SPAN><SPAN class=symbol><</SPAN> chrsz<SPAN class=braces>)</SPAN> - <SPAN class=numeric>1</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>for</SPAN><SPAN class=braces>(</SPAN><SPAN class=reserved_word>var</SPAN> i <SPAN class=symbol>=</SPAN> <SPAN class=numeric>0</SPAN><SPAN class=symbol>;</SPAN> i <SPAN class=symbol><</SPAN> str.<SPAN class=predefined_identifier>length</SPAN> * chrsz<SPAN class=symbol>;</SPAN> i +<SPAN class=symbol>=</SPAN> chrsz<SPAN class=braces>)</SPAN> bin[i<SPAN class=symbol>></span><span class="symbol">></span><span class="numeric">5</span>] <span class="symbol">|</span><span class="symbol">=</span> <span class="braces">(</span>str.charCodeAt<span class="braces">(</span>i <span class="symbol">/</span> chrsz<span class="braces">)</span> <span class="symbol">&</span> mask<span class="braces">)</span> <span class="symbol"><</SPAN><SPAN class=symbol><</SPAN> <SPAN class=braces>(</SPAN><SPAN class=numeric>32</SPAN> - chrsz - i%<SPAN class=numeric>32</SPAN><SPAN class=braces>)</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>return</SPAN> bin<SPAN class=symbol>;</SPAN> <SPAN class=braces>}</SPAN> <SPAN class=comment>/* * Convert an array of big-endian words to a string */</SPAN> <SPAN class=reserved_word>function</SPAN> binb2str<SPAN class=braces>(</SPAN>bin<SPAN class=braces>)</SPAN> <SPAN class=braces>{</SPAN> <SPAN class=reserved_word>var</SPAN> str <SPAN class=symbol>=</SPAN> <SPAN class=string>""</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>var</SPAN> mask <SPAN class=symbol>=</SPAN> <SPAN class=braces>(</SPAN><SPAN class=numeric>1</SPAN> <SPAN class=symbol><</SPAN><SPAN class=symbol><</SPAN> chrsz<SPAN class=braces>)</SPAN> - <SPAN class=numeric>1</SPAN><SPAN class=symbol>;</SPAN> <SPAN class=reserved_word>for</SPAN><SPAN class=braces>(</SPAN><SPAN class=reserved_word>var</SPAN> i <SPAN class=symbol>=</SPAN> <SPAN class=numeric>0</SPAN><SPAN class=symbol>;</SPAN> i <SPAN class=symbol><</SPAN> bin.<SPAN class=predefined_identifier>length</SPAN> * <SPAN class=numeric>32</SPAN><SPAN class=symbol>;</SPAN> i +<SPAN class=symbol>=</SPAN> chrsz<SPAN class=braces>)</SPAN> str +<SPAN class=symbol>=</SPAN> String.fromCharCode<SPAN class=braces>(</SPAN><SPAN class=braces>(</SPAN>bin[i<SPAN class=symbol>></span><span class="symbol">></span><span class="numeric">5</span>] <span class="symbol">></span><span class="symbol">></span><span class="symbol">></span> <span class="braces">(</span><span class="numeric">32</span> - chrsz - i%<span class="numeric">32</span><span class="braces">)</span><span class="braces">)</span> <span class="symbol">&</span> mask<span class="braces">)</span><span class="symbol">;</span> <span class="reserved_word">return</span> str<span class="symbol">;</span> <span class="braces">}</span> <span class="comment">/* * Convert an array of big-endian words to a hex string. */</span> <span class="reserved_word">function</span> binb2hex<span class="braces">(</span>binarray<span class="braces">)</span> <span class="braces">{</span> <span class="reserved_word">var</span> hex_tab <span class="symbol">=</span> hexcase ? <span class="string">"0123456789ABCDEF"</span> : <span class="string">"0123456789abcdef"</span><span class="symbol">;</span> <span class="reserved_word">var</span> str <span class="symbol">=</span> <span class="string">""</span><span class="symbol">;</span> <span class="reserved_word">for</span><span class="braces">(</span><span class="reserved_word">var</span> i <span class="symbol">=</span> <span class="numeric">0</span><span class="symbol">;</span> i <span class="symbol"><</SPAN> binarray.<SPAN class=predefined_identifier>length</SPAN> * <SPAN class=numeric>4</SPAN><SPAN class=symbol>;</SPAN> i++<SPAN class=braces>)</SPAN> <SPAN class=braces>{</SPAN> str +<SPAN class=symbol>=</SPAN> hex_tab.<SPAN class=library_function>charAt</SPAN><SPAN class=braces>(</SPAN><SPAN class=braces>(</SPAN>binarray[i<SPAN class=symbol>></span><span class="symbol">></span><span class="numeric">2</span>] <span class="symbol">></span><span class="symbol">></span> <span class="braces">(</span><span class="braces">(</span><span class="numeric">3</span> - i%<span class="numeric">4</span><span class="braces">)</span>*<span class="numeric">8</span>+<span class="numeric">4</span><span class="braces">)</span><span class="braces">)</span> <span class="symbol">&</span> <span class="numeric">0xF</span><span class="braces">)</span> + hex_tab.<span class="library_function">charAt</span><span class="braces">(</span><span class="braces">(</span>binarray[i<span class="symbol">></span><span class="symbol">></span><span class="numeric">2</span>] <span class="symbol">></span><span class="symbol">></span> <span class="braces">(</span><span class="braces">(</span><span class="numeric">3</span> - i%<span class="numeric">4</span><span class="braces">)</span>*<span class="numeric">8</span> <span class="braces">)</span><span class="braces">)</span> <span class="symbol">&</span> <span class="numeric">0xF</span><span class="braces">)</span><span class="symbol">;</span> <span class="braces">}</span> <span class="reserved_word">return</span> str<span class="symbol">;</span> <span class="braces">}</span> <span class="comment">/* * Convert an array of big-endian words to a base-64 string */</span> <span class="reserved_word">function</span> binb2b64<span class="braces">(</span>binarray<span class="braces">)</span> <span class="braces">{</span> <span class="reserved_word">var</span> tab <span class="symbol">=</span> <span class="string">"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"</span><span class="symbol">;</span> <span class="reserved_word">var</span> str <span class="symbol">=</span> <span class="string">""</span><span class="symbol">;</span> <span class="reserved_word">for</span><span class="braces">(</span><span class="reserved_word">var</span> i <span class="symbol">=</span> <span class="numeric">0</span><span class="symbol">;</span> i <span class="symbol"><</SPAN> binarray.<SPAN class=predefined_identifier>length</SPAN> * <SPAN class=numeric>4</SPAN><SPAN class=symbol>;</SPAN> i +<SPAN class=symbol>=</SPAN> <SPAN class=numeric>3</SPAN><SPAN class=braces>)</SPAN> <SPAN class=braces>{</SPAN> <SPAN class=reserved_word>var</SPAN> triplet <SPAN class=symbol>=</SPAN> <SPAN class=braces>(</SPAN><SPAN class=braces>(</SPAN><SPAN class=braces>(</SPAN>binarray[i <SPAN class=symbol>></span><span class="symbol">></span> <span class="numeric">2</span>] <span class="symbol">></span><span class="symbol">></span> <span class="numeric">8</span> * <span class="braces">(</span><span class="numeric">3</span> - i %<span class="numeric">4</span><span class="braces">)</span><span class="braces">)</span> <span class="symbol">&</span> <span class="numeric">0xFF</span><span class="braces">)</span> <span class="symbol"><</SPAN><SPAN class=symbol><</SPAN> <SPAN class=numeric>16</SPAN><SPAN class=braces>)</SPAN> <SPAN class=symbol>|</SPAN> <SPAN class=braces>(</SPAN><SPAN class=braces>(</SPAN><SPAN class=braces>(</SPAN>binarray[i+<SPAN class=numeric>1</SPAN> <SPAN class=symbol>></span><span class="symbol">></span> <span class="numeric">2</span>] <span class="symbol">></span><span class="symbol">></span> <span class="numeric">8</span> * <span class="braces">(</span><span class="numeric">3</span> - <span class="braces">(</span>i+<span class="numeric">1</span><span class="braces">)</span>%<span class="numeric">4</span><span class="braces">)</span><span class="braces">)</span> <span class="symbol">&</span> <span class="numeric">0xFF</span><span class="braces">)</span> <span class="symbol"><</SPAN><SPAN class=symbol><</SPAN> <SPAN class=numeric>8</SPAN> <SPAN class=braces>)</SPAN> <SPAN class=symbol>|</SPAN> <SPAN class=braces>(</SPAN><SPAN class=braces>(</SPAN>binarray[i+<SPAN class=numeric>2</SPAN> <SPAN class=symbol>></span><span class="symbol">></span> <span class="numeric">2</span>] <span class="symbol">></span><span class="symbol">></span> <span class="numeric">8</span> * <span class="braces">(</span><span class="numeric">3</span> - <span class="braces">(</span>i+<span class="numeric">2</span><span class="braces">)</span>%<span class="numeric">4</span><span class="braces">)</span><span class="braces">)</span> <span class="symbol">&</span> <span class="numeric">0xFF</span><span class="braces">)</span><span class="symbol">;</span> <span class="reserved_word">for</span><span class="braces">(</span><span class="reserved_word">var</span> j <span class="symbol">=</span> <span class="numeric">0</span><span class="symbol">;</span> j <span class="symbol"><</SPAN> <SPAN class=numeric>4</SPAN><SPAN class=symbol>;</SPAN> j++<SPAN class=braces>)</SPAN> <SPAN class=braces>{</SPAN> <SPAN class=reserved_word>if</SPAN><SPAN class=braces>(</SPAN>i * <SPAN class=numeric>8</SPAN> + j * <SPAN class=numeric>6</SPAN> <SPAN class=symbol>></span> binarray.<span class="predefined_identifier">length</span> * <span class="numeric">32</span><span class="braces">)</span> str +<span class="symbol">=</span> b64pad<span class="symbol">;</span> <span class="reserved_word">else</span> str +<span class="symbol">=</span> tab.<span class="library_function">charAt</span><span class="braces">(</span><span class="braces">(</span>triplet <span class="symbol">></span><span class="symbol">></span> <span class="numeric">6</span>*<span class="braces">(</span><span class="numeric">3</span>-j<span class="braces">)</span><span class="braces">)</span> <span class="symbol">&</span> <span class="numeric">0x3F</span><span class="braces">)</span><span class="symbol">;</span> <span class="braces">}</span> <span class="braces">}</span> <span class="reserved_word">return</span> str<span class="symbol">;</span> <span class="braces">}</span>

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제









WebSocket 및 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 소개: 지속적인 기술 개발로 음성 인식 기술은 인공 지능 분야의 중요한 부분이 되었습니다. WebSocket과 JavaScript를 기반으로 한 온라인 음성 인식 시스템은 낮은 대기 시간, 실시간, 크로스 플랫폼이라는 특징을 갖고 있으며 널리 사용되는 솔루션이 되었습니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법을 소개합니다.

WebSocket과 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 서론: 인터넷 기술의 급속한 발전과 함께 실시간 모니터링 시스템이 다양한 분야에서 널리 활용되고 있다. 실시간 모니터링을 구현하는 핵심 기술 중 하나는 WebSocket과 JavaScript의 조합입니다. 이 기사에서는 실시간 모니터링 시스템에서 WebSocket 및 JavaScript의 적용을 소개하고 코드 예제를 제공하며 구현 원칙을 자세히 설명합니다. 1. 웹소켓 기술

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 오늘날의 디지털 시대에는 점점 더 많은 기업과 서비스에서 온라인 예약 기능을 제공해야 합니다. 효율적인 실시간 온라인 예약 시스템을 구현하는 것이 중요합니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. WebSocket이란 무엇입니까? WebSocket은 단일 TCP 연결의 전이중 방식입니다.

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 소개: 인터넷의 대중화와 기술의 발전으로 점점 더 많은 레스토랑에서 온라인 주문 서비스를 제공하기 시작했습니다. 실시간 온라인 주문 시스템을 구현하기 위해 JavaScript 및 WebSocket 기술을 사용할 수 있습니다. WebSocket은 TCP 프로토콜을 기반으로 하는 전이중 통신 프로토콜로 클라이언트와 서버 간의 실시간 양방향 통신을 실현할 수 있습니다. 실시간 온라인 주문 시스템에서는 사용자가 요리를 선택하고 주문을 하면

JavaScript 및 WebSocket: 효율적인 실시간 일기 예보 시스템 구축 소개: 오늘날 일기 예보의 정확성은 일상 생활과 의사 결정에 매우 중요합니다. 기술이 발전함에 따라 우리는 날씨 데이터를 실시간으로 획득함으로써 보다 정확하고 신뢰할 수 있는 일기예보를 제공할 수 있습니다. 이 기사에서는 JavaScript 및 WebSocket 기술을 사용하여 효율적인 실시간 일기 예보 시스템을 구축하는 방법을 알아봅니다. 이 문서에서는 특정 코드 예제를 통해 구현 프로세스를 보여줍니다. 우리

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

사용법: JavaScript에서 insertBefore() 메서드는 DOM 트리에 새 노드를 삽입하는 데 사용됩니다. 이 방법에는 삽입할 새 노드와 참조 노드(즉, 새 노드가 삽입될 노드)라는 두 가지 매개 변수가 필요합니다.

JavaScript에서 HTTP 상태 코드를 얻는 방법 소개: 프런트 엔드 개발에서 우리는 종종 백엔드 인터페이스와의 상호 작용을 처리해야 하며 HTTP 상태 코드는 매우 중요한 부분입니다. HTTP 상태 코드를 이해하고 얻는 것은 인터페이스에서 반환된 데이터를 더 잘 처리하는 데 도움이 됩니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. HTTP 상태 코드란 무엇입니까? HTTP 상태 코드는 브라우저가 서버에 요청을 시작할 때 서비스가
