javascript实现des解密加密全过程


Posted in Javascript onApril 03, 2014
//Paul Tero, July 2001 
//http://www.tero.co.uk/des/ 
// 
//Optimised for performance with large blocks by Michael Hayworth, November 2001 
//http://www.netdealing.com 
// 
//THIS SOFTWARE IS PROVIDED "AS IS" AND 
//ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
//IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
//ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 
//FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
//DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
//OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
//HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
//OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
//SUCH DAMAGE. //des 
//this takes the key, the message, and whether to encrypt or decrypt 
function des (key, message, encrypt, mode, iv, padding) { 
//declaring this locally speeds things up a bit 
var spfunction1 = new Array (0x1010400,0,0x10000,0x1010404,0x1010004,0x10404,0x4,0x10000,0x400,0x1010400,0x1010404,0x400,0x1000404,0x1010004,0x1000000,0x4,0x404,0x1000400,0x1000400,0x10400,0x10400,0x1010000,0x1010000,0x1000404,0x10004,0x1000004,0x1000004,0x10004,0,0x404,0x10404,0x1000000,0x10000,0x1010404,0x4,0x1010000,0x1010400,0x1000000,0x1000000,0x400,0x1010004,0x10000,0x10400,0x1000004,0x400,0x4,0x1000404,0x10404,0x1010404,0x10004,0x1010000,0x1000404,0x1000004,0x404,0x10404,0x1010400,0x404,0x1000400,0x1000400,0,0x10004,0x10400,0,0x1010004); 
var spfunction2 = new Array (-0x7fef7fe0,-0x7fff8000,0x8000,0x108020,0x100000,0x20,-0x7fefffe0,-0x7fff7fe0,-0x7fffffe0,-0x7fef7fe0,-0x7fef8000,-0x80000000,-0x7fff8000,0x100000,0x20,-0x7fefffe0,0x108000,0x100020,-0x7fff7fe0,0,-0x80000000,0x8000,0x108020,-0x7ff00000,0x100020,-0x7fffffe0,0,0x108000,0x8020,-0x7fef8000,-0x7ff00000,0x8020,0,0x108020,-0x7fefffe0,0x100000,-0x7fff7fe0,-0x7ff00000,-0x7fef8000,0x8000,-0x7ff00000,-0x7fff8000,0x20,-0x7fef7fe0,0x108020,0x20,0x8000,-0x80000000,0x8020,-0x7fef8000,0x100000,-0x7fffffe0,0x100020,-0x7fff7fe0,-0x7fffffe0,0x100020,0x108000,0,-0x7fff8000,0x8020,-0x80000000,-0x7fefffe0,-0x7fef7fe0,0x108000); 
var spfunction3 = new Array (0x208,0x8020200,0,0x8020008,0x8000200,0,0x20208,0x8000200,0x20008,0x8000008,0x8000008,0x20000,0x8020208,0x20008,0x8020000,0x208,0x8000000,0x8,0x8020200,0x200,0x20200,0x8020000,0x8020008,0x20208,0x8000208,0x20200,0x20000,0x8000208,0x8,0x8020208,0x200,0x8000000,0x8020200,0x8000000,0x20008,0x208,0x20000,0x8020200,0x8000200,0,0x200,0x20008,0x8020208,0x8000200,0x8000008,0x200,0,0x8020008,0x8000208,0x20000,0x8000000,0x8020208,0x8,0x20208,0x20200,0x8000008,0x8020000,0x8000208,0x208,0x8020000,0x20208,0x8,0x8020008,0x20200); 
var spfunction4 = new Array (0x802001,0x2081,0x2081,0x80,0x802080,0x800081,0x800001,0x2001,0,0x802000,0x802000,0x802081,0x81,0,0x800080,0x800001,0x1,0x2000,0x800000,0x802001,0x80,0x800000,0x2001,0x2080,0x800081,0x1,0x2080,0x800080,0x2000,0x802080,0x802081,0x81,0x800080,0x800001,0x802000,0x802081,0x81,0,0,0x802000,0x2080,0x800080,0x800081,0x1,0x802001,0x2081,0x2081,0x80,0x802081,0x81,0x1,0x2000,0x800001,0x2001,0x802080,0x800081,0x2001,0x2080,0x800000,0x802001,0x80,0x800000,0x2000,0x802080); 
var spfunction5 = new Array (0x100,0x2080100,0x2080000,0x42000100,0x80000,0x100,0x40000000,0x2080000,0x40080100,0x80000,0x2000100,0x40080100,0x42000100,0x42080000,0x80100,0x40000000,0x2000000,0x40080000,0x40080000,0,0x40000100,0x42080100,0x42080100,0x2000100,0x42080000,0x40000100,0,0x42000000,0x2080100,0x2000000,0x42000000,0x80100,0x80000,0x42000100,0x100,0x2000000,0x40000000,0x2080000,0x42000100,0x40080100,0x2000100,0x40000000,0x42080000,0x2080100,0x40080100,0x100,0x2000000,0x42080000,0x42080100,0x80100,0x42000000,0x42080100,0x2080000,0,0x40080000,0x42000000,0x80100,0x2000100,0x40000100,0x80000,0,0x40080000,0x2080100,0x40000100); 
var spfunction6 = new Array (0x20000010,0x20400000,0x4000,0x20404010,0x20400000,0x10,0x20404010,0x400000,0x20004000,0x404010,0x400000,0x20000010,0x400010,0x20004000,0x20000000,0x4010,0,0x400010,0x20004010,0x4000,0x404000,0x20004010,0x10,0x20400010,0x20400010,0,0x404010,0x20404000,0x4010,0x404000,0x20404000,0x20000000,0x20004000,0x10,0x20400010,0x404000,0x20404010,0x400000,0x4010,0x20000010,0x400000,0x20004000,0x20000000,0x4010,0x20000010,0x20404010,0x404000,0x20400000,0x404010,0x20404000,0,0x20400010,0x10,0x4000,0x20400000,0x404010,0x4000,0x400010,0x20004010,0,0x20404000,0x20000000,0x400010,0x20004010); 
var spfunction7 = new Array (0x200000,0x4200002,0x4000802,0,0x800,0x4000802,0x200802,0x4200800,0x4200802,0x200000,0,0x4000002,0x2,0x4000000,0x4200002,0x802,0x4000800,0x200802,0x200002,0x4000800,0x4000002,0x4200000,0x4200800,0x200002,0x4200000,0x800,0x802,0x4200802,0x200800,0x2,0x4000000,0x200800,0x4000000,0x200800,0x200000,0x4000802,0x4000802,0x4200002,0x4200002,0x2,0x200002,0x4000000,0x4000800,0x200000,0x4200800,0x802,0x200802,0x4200800,0x802,0x4000002,0x4200802,0x4200000,0x200800,0,0x2,0x4200802,0,0x200802,0x4200000,0x800,0x4000002,0x4000800,0x800,0x200002); 
var spfunction8 = new Array (0x10001040,0x1000,0x40000,0x10041040,0x10000000,0x10001040,0x40,0x10000000,0x40040,0x10040000,0x10041040,0x41000,0x10041000,0x41040,0x1000,0x40,0x10040000,0x10000040,0x10001000,0x1040,0x41000,0x40040,0x10040040,0x10041000,0x1040,0,0,0x10040040,0x10000040,0x10001000,0x41040,0x40000,0x41040,0x40000,0x10041000,0x1000,0x40,0x10040040,0x1000,0x41040,0x10001000,0x40,0x10000040,0x10040000,0x10040040,0x10000000,0x40000,0x10001040,0,0x10041040,0x40040,0x10000040,0x10040000,0x10001000,0x10001040,0,0x10041040,0x41000,0x41000,0x1040,0x1040,0x40040,0x10000000,0x10041000); 
//create the 16 or 48 subkeys we will need 
var keys = des_createKeys (key); 
var m=0, i, j, temp, temp2, right1, right2, left, right, looping; 
var cbcleft, cbcleft2, cbcright, cbcright2 
var endloop, loopinc; 
var len = message.length; 
var chunk = 0; 
//set up the loops for single and triple des 
var iterations = keys.length == 32 ? 3 : 9; //single or triple des 
if (iterations == 3) {looping = encrypt ? new Array (0, 32, 2) : new Array (30, -2, -2);} 
else {looping = encrypt ? new Array (0, 32, 2, 62, 30, -2, 64, 96, 2) : new Array (94, 62, -2, 32, 64, 2, 30, -2, -2);} 
//pad the message depending on the padding parameter 
if (padding == 2) message += " "; //pad the message with spaces 
else if (padding == 1) {temp = 8-(len%8); message += String.fromCharCode (temp,temp,temp,temp,temp,temp,temp,temp); if (temp==8) len+=8;} //PKCS7 padding 
else if (!padding) message += "\0\0\0\0\0\0\0\0"; //pad the message out with null bytes 
//store the result here 
result = ""; 
tempresult = ""; 
if (mode == 1) { //CBC mode 
cbcleft = (iv.charCodeAt(m++) << 24) | (iv.charCodeAt(m++) << 16) | (iv.charCodeAt(m++) << 8) | iv.charCodeAt(m++); 
cbcright = (iv.charCodeAt(m++) << 24) | (iv.charCodeAt(m++) << 16) | (iv.charCodeAt(m++) << 8) | iv.charCodeAt(m++); 
m=0; 
} 
//loop through each 64 bit chunk of the message 
while (m < len) { 
left = (message.charCodeAt(m++) << 24) | (message.charCodeAt(m++) << 16) | (message.charCodeAt(m++) << 8) | message.charCodeAt(m++); 
right = (message.charCodeAt(m++) << 24) | (message.charCodeAt(m++) << 16) | (message.charCodeAt(m++) << 8) | message.charCodeAt(m++); 
//for Cipher Block Chaining mode, xor the message with the previous result 
if (mode == 1) {if (encrypt) {left ^= cbcleft; right ^= cbcright;} else {cbcleft2 = cbcleft; cbcright2 = cbcright; cbcleft = left; cbcright = right;}} 
//first each 64 but chunk of the message must be permuted according to IP 
temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; right ^= temp; left ^= (temp << 4); 
temp = ((left >>> 16) ^ right) & 0x0000ffff; right ^= temp; left ^= (temp << 16); 
temp = ((right >>> 2) ^ left) & 0x33333333; left ^= temp; right ^= (temp << 2); 
temp = ((right >>> 8) ^ left) & 0x00ff00ff; left ^= temp; right ^= (temp << 8); 
temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1); 
left = ((left << 1) | (left >>> 31)); 
right = ((right << 1) | (right >>> 31)); 
//do this either 1 or 3 times for each chunk of the message 
for (j=0; j<iterations; j+=3) { 
endloop = looping[j+1]; 
loopinc = looping[j+2]; 
//now go through and perform the encryption or decryption 
for (i=looping[j]; i!=endloop; i+=loopinc) { //for efficiency 
right1 = right ^ keys[i]; 
right2 = ((right >>> 4) | (right << 28)) ^ keys[i+1]; 
//the result is attained by passing these bytes through the S selection functions 
temp = left; 
left = right; 
right = temp ^ (spfunction2[(right1 >>> 24) & 0x3f] | spfunction4[(right1 >>> 16) & 0x3f] 
| spfunction6[(right1 >>> 8) & 0x3f] | spfunction8[right1 & 0x3f] 
| spfunction1[(right2 >>> 24) & 0x3f] | spfunction3[(right2 >>> 16) & 0x3f] 
| spfunction5[(right2 >>> 8) & 0x3f] | spfunction7[right2 & 0x3f]); 
} 
temp = left; left = right; right = temp; //unreverse left and right 
} //for either 1 or 3 iterations 
//move then each one bit to the right 
left = ((left >>> 1) | (left << 31)); 
right = ((right >>> 1) | (right << 31)); 
//now perform IP-1, which is IP in the opposite direction 
temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1); 
temp = ((right >>> 8) ^ left) & 0x00ff00ff; left ^= temp; right ^= (temp << 8); 
temp = ((right >>> 2) ^ left) & 0x33333333; left ^= temp; right ^= (temp << 2); 
temp = ((left >>> 16) ^ right) & 0x0000ffff; right ^= temp; left ^= (temp << 16); 
temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; right ^= temp; left ^= (temp << 4); 
//for Cipher Block Chaining mode, xor the message with the previous result 
if (mode == 1) {if (encrypt) {cbcleft = left; cbcright = right;} else {left ^= cbcleft2; right ^= cbcright2;}} 
tempresult += String.fromCharCode ((left>>>24), ((left>>>16) & 0xff), ((left>>>8) & 0xff), (left & 0xff), (right>>>24), ((right>>>16) & 0xff), ((right>>>8) & 0xff), (right & 0xff)); 
chunk += 8; 
if (chunk == 512) {result += tempresult; tempresult = ""; chunk = 0;} 
} //for every 8 characters, or 64 bits in the message 
//return the result as an array 
return result + tempresult; 
} //end of des 

//des_createKeys 
//this takes as input a 64 bit key (even though only 56 bits are used) 
//as an array of 2 integers, and returns 16 48 bit keys 
function des_createKeys (key) { 
//declaring this locally speeds things up a bit 
pc2bytes0 = new Array (0,0x4,0x20000000,0x20000004,0x10000,0x10004,0x20010000,0x20010004,0x200,0x204,0x20000200,0x20000204,0x10200,0x10204,0x20010200,0x20010204); 
pc2bytes1 = new Array (0,0x1,0x100000,0x100001,0x4000000,0x4000001,0x4100000,0x4100001,0x100,0x101,0x100100,0x100101,0x4000100,0x4000101,0x4100100,0x4100101); 
pc2bytes2 = new Array (0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808,0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808); 
pc2bytes3 = new Array (0,0x200000,0x8000000,0x8200000,0x2000,0x202000,0x8002000,0x8202000,0x20000,0x220000,0x8020000,0x8220000,0x22000,0x222000,0x8022000,0x8222000); 
pc2bytes4 = new Array (0,0x40000,0x10,0x40010,0,0x40000,0x10,0x40010,0x1000,0x41000,0x1010,0x41010,0x1000,0x41000,0x1010,0x41010); 
pc2bytes5 = new Array (0,0x400,0x20,0x420,0,0x400,0x20,0x420,0x2000000,0x2000400,0x2000020,0x2000420,0x2000000,0x2000400,0x2000020,0x2000420); 
pc2bytes6 = new Array (0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002,0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002); 
pc2bytes7 = new Array (0,0x10000,0x800,0x10800,0x20000000,0x20010000,0x20000800,0x20010800,0x20000,0x30000,0x20800,0x30800,0x20020000,0x20030000,0x20020800,0x20030800); 
pc2bytes8 = new Array (0,0x40000,0,0x40000,0x2,0x40002,0x2,0x40002,0x2000000,0x2040000,0x2000000,0x2040000,0x2000002,0x2040002,0x2000002,0x2040002); 
pc2bytes9 = new Array (0,0x10000000,0x8,0x10000008,0,0x10000000,0x8,0x10000008,0x400,0x10000400,0x408,0x10000408,0x400,0x10000400,0x408,0x10000408); 
pc2bytes10 = new Array (0,0x20,0,0x20,0x100000,0x100020,0x100000,0x100020,0x2000,0x2020,0x2000,0x2020,0x102000,0x102020,0x102000,0x102020); 
pc2bytes11 = new Array (0,0x1000000,0x200,0x1000200,0x200000,0x1200000,0x200200,0x1200200,0x4000000,0x5000000,0x4000200,0x5000200,0x4200000,0x5200000,0x4200200,0x5200200); 
pc2bytes12 = new Array (0,0x1000,0x8000000,0x8001000,0x80000,0x81000,0x8080000,0x8081000,0x10,0x1010,0x8000010,0x8001010,0x80010,0x81010,0x8080010,0x8081010); 
pc2bytes13 = new Array (0,0x4,0x100,0x104,0,0x4,0x100,0x104,0x1,0x5,0x101,0x105,0x1,0x5,0x101,0x105); 
//how many iterations (1 for des, 3 for triple des) 
var iterations = key.length > 8 ? 3 : 1; //changed by Paul 16/6/2007 to use Triple DES for 9+ byte keys 
//stores the return keys 
var keys = new Array (32 * iterations); 
//now define the left shifts which need to be done 
var shifts = new Array (0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0); 
//other variables 
var lefttemp, righttemp, m=0, n=0, temp; 
for (var j=0; j<iterations; j++) { //either 1 or 3 iterations 
left = (key.charCodeAt(m++) << 24) | (key.charCodeAt(m++) << 16) | (key.charCodeAt(m++) << 8) | key.charCodeAt(m++); 
right = (key.charCodeAt(m++) << 24) | (key.charCodeAt(m++) << 16) | (key.charCodeAt(m++) << 8) | key.charCodeAt(m++); 
temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; right ^= temp; left ^= (temp << 4); 
temp = ((right >>> -16) ^ left) & 0x0000ffff; left ^= temp; right ^= (temp << -16); 
temp = ((left >>> 2) ^ right) & 0x33333333; right ^= temp; left ^= (temp << 2); 
temp = ((right >>> -16) ^ left) & 0x0000ffff; left ^= temp; right ^= (temp << -16); 
temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1); 
temp = ((right >>> 8) ^ left) & 0x00ff00ff; left ^= temp; right ^= (temp << 8); 
temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1); 
//the right side needs to be shifted and to get the last four bits of the left side 
temp = (left << 8) | ((right >>> 20) & 0x000000f0); 
//left needs to be put upside down 
left = (right << 24) | ((right << 8) & 0xff0000) | ((right >>> 8) & 0xff00) | ((right >>> 24) & 0xf0); 
right = temp; 
//now go through and perform these shifts on the left and right keys 
for (var i=0; i < shifts.length; i++) { 
//shift the keys either one or two bits to the left 
if (shifts[i]) {left = (left << 2) | (left >>> 26); right = (right << 2) | (right >>> 26);} 
else {left = (left << 1) | (left >>> 27); right = (right << 1) | (right >>> 27);} 
left &= -0xf; right &= -0xf; 
//now apply PC-2, in such a way that E is easier when encrypting or decrypting 
//this conversion will look like PC-2 except only the last 6 bits of each byte are used 
//rather than 48 consecutive bits and the order of lines will be according to 
//how the S selection functions will be applied: S2, S4, S6, S8, S1, S3, S5, S7 
lefttemp = pc2bytes0[left >>> 28] | pc2bytes1[(left >>> 24) & 0xf] 
| pc2bytes2[(left >>> 20) & 0xf] | pc2bytes3[(left >>> 16) & 0xf] 
| pc2bytes4[(left >>> 12) & 0xf] | pc2bytes5[(left >>> 8) & 0xf] 
| pc2bytes6[(left >>> 4) & 0xf]; 
righttemp = pc2bytes7[right >>> 28] | pc2bytes8[(right >>> 24) & 0xf] 
| pc2bytes9[(right >>> 20) & 0xf] | pc2bytes10[(right >>> 16) & 0xf] 
| pc2bytes11[(right >>> 12) & 0xf] | pc2bytes12[(right >>> 8) & 0xf] 
| pc2bytes13[(right >>> 4) & 0xf]; 
temp = ((righttemp >>> 16) ^ lefttemp) & 0x0000ffff; 
keys[n++] = lefttemp ^ temp; keys[n++] = righttemp ^ (temp << 16); 
} 
} //for each iterations 
//return the keys we've created 
return keys; 
} //end of des_createKeys 

////////////////////////////// TEST ////////////////////////////// 
function stringToHex (s) { 
var r = "0x"; 
var hexes = new Array ("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"); 
for (var i=0; i<s.length; i++) {r += hexes [s.charCodeAt(i) >> 4] + hexes [s.charCodeAt(i) & 0xf];} 
return r; 
} 
function hexToString (h) { 
var r = ""; 
for (var i= (h.substr(0, 2)=="0x")?2:0; i<h.length; i+=2) {r += String.fromCharCode (parseInt (h.substr (i, 2), 16));} 
return r; 
} 
var key = "this is a 24 byte key !!"; 
var message = "This is a test message"; 
var ciphertext = des (key, message, 1, 0); 
document.writeln ("DES Test: " + stringToHex (ciphertext));
Javascript 相关文章推荐
JS获取scrollHeight问题想到的标准问题
May 27 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
Apr 13 Javascript
JavaScript性能陷阱小结(附实例说明)
Dec 28 Javascript
通过正则格式化url查询字符串实现代码
Dec 28 Javascript
javascript判断chrome浏览器的方法
Mar 26 Javascript
Angular的Bootstrap(引导)和Compiler(编译)机制
Jun 20 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
Jan 20 Javascript
js实现简易垂直滚动条
Feb 22 Javascript
zTree树形插件异步加载方法详解
Jun 14 Javascript
JavaScript EventEmitter 背后的秘密 完整版
Mar 29 Javascript
vue自定义指令之面板拖拽的实现
Apr 14 Javascript
JS中this的4种绑定规则详解
Feb 04 Javascript
无刷新预览所选择的图片示例代码
Apr 02 #Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
Apr 02 #Javascript
jquery跟js初始化加载的多种方法及区别介绍
Apr 02 #Javascript
jquery中子元素和后代元素的区别示例介绍
Apr 02 #Javascript
js 日期比较相关天数代码
Apr 02 #Javascript
你未必知道的JavaScript和CSS交互的5种方法
Apr 02 #Javascript
网页广告中JS代码的信息监听示例
Apr 02 #Javascript
You might like
浅析php中jsonp的跨域实例
2013/06/21 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
jQuery技巧大放送 学习jquery的朋友可以看下
2009/10/14 Javascript
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
jQuery 工具函数学习资料
2010/04/29 Javascript
jQuery 学习第五课 Ajax 使用说明
2010/05/17 Javascript
DLL+ ActiveX控件+WEB页面调用例子
2010/08/07 Javascript
JavaScript之引用类型介绍
2012/08/10 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
详解Angular中$cacheFactory缓存的使用
2016/08/19 Javascript
jQuery设计思想
2017/03/07 Javascript
canvas实现弧形可拖动进度条效果
2017/05/11 Javascript
jQuery返回定位插件详解
2017/05/15 jQuery
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
2018/07/31 jQuery
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
Python比较两个图片相似度的方法
2015/03/13 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
2018/01/23 Python
pyqt5自定义信号实例解析
2018/01/31 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
VSCode中自动为Python文件添加头部注释
2019/11/14 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
药品促销活动方案
2014/02/14 职场文书
大学军训感言600字
2014/02/25 职场文书
工程建设实施方案
2014/03/14 职场文书
十佳护士先进事迹
2014/05/08 职场文书
财务负责人岗位职责
2015/02/03 职场文书
Nginx配置并兼容HTTP实现代码解析
2021/03/31 Servers
OpenCV实现反阈值二值化
2021/11/17 Java/Android
使用Python拟合函数曲线
2022/04/14 Python