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 相关文章推荐
关于event.cancelBubble和event.stopPropagation()的区别介绍
Dec 11 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
Feb 25 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
Aug 21 Javascript
谷歌地图打不开的解决办法
Aug 07 Javascript
javascript格式化日期时间方法汇总
Jun 19 Javascript
JavaScript性能优化之小知识总结
Nov 20 Javascript
详解Vue中状态管理Vuex
May 11 Javascript
vue-better-scroll 的使用实例代码详解
Dec 03 Javascript
基于vue.js实现分页查询功能
Dec 29 Javascript
jQuery--遍历操作实例小结【后代、同胞及过滤】
May 22 jQuery
解决vue使用vant轮播组件swipe + flex时文字抖动问题
Jan 07 Vue.js
开发一个封装iframe的vue组件
Mar 29 Vue.js
无刷新预览所选择的图片示例代码
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下使用iconv需要注意的问题
2010/11/20 PHP
Linux下PHP安装mcrypt扩展模块笔记
2014/09/10 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
2010/01/22 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
基于javascript实现页面加载loading效果
2020/09/15 Javascript
基于Vue如何封装分页组件
2016/12/16 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
前端axios下载excel文件(二进制)的处理方法
2018/07/31 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
vue-cli中安装方法(图文详细步骤)
2018/12/12 Javascript
微信小程序修改checkbox的样式代码实例
2020/01/21 Javascript
vue+springboot图片上传和显示的示例代码
2020/02/14 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
微信小程序实现简单文字跑马灯
2020/05/26 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
JavaScript实现与web通信的方法详解
2020/08/07 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
Gauss-Seidel迭代算法的Python实现详解
2019/06/29 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
Python Pandas中根据列的值选取多行数据
2019/07/08 Python
python装饰器练习题及答案
2019/11/01 Python
Python实现EM算法实例代码
2020/10/04 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
存储过程和sql语句的优缺点
2014/07/02 面试题
品恩科技软件测试面试题
2014/10/26 面试题
《莫高窟》教学反思
2014/02/25 职场文书
买卖车协议书
2014/04/21 职场文书
庭外和解协议书
2016/03/23 职场文书
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技
我去timi了,一起去timi是什么意思?
2022/04/13 杂记