日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > web前端 > jscript > JavaScript優化篇:BASE64極速版

JavaScript優化篇:BASE64極速版

來源:程序員人生   發布時間:2013-11-11 23:57:45 閱讀次數:2671次

  網(LieHuo.Net)教程 BASE64原理很簡單,但要寫出一個高效的,尤其是用JS這樣高靈活低效率的腳本,還需斟酌一翻。

  先看看網上比較流行的版本。首先聲明64個常量字符:

以下為引用的內容:
var key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

  這一步大家都一樣,也沒有更好的方法列出這些字符。但接下來的做法,就大有講究了。因為這里的key是一個String,所以各個版本里都大量充斥著charAt,甚至indexOf函數來操作這個key。用charAt來訪問key的第n個字符,這還在清理之中;但用indexOf來確定字符的位置,就不可原諒了。在VBScript里倒還能湊合著用,但在JS里這種做法是很糟糕的,顯然沒有把其靈活性發揮出來。何謂靈活性,用最短的話說就是多用哈希表。哈希表是JS與生俱來就有的東西,其效率是其他方法都不能相比的。顯然,在BASE64這樣數字與字符頻繁轉換的算法里,hash是該大顯身手的。

  再談charAt的問題。charAt雖然不會像indexOf那樣效率數量級的下降,但也不是最優秀的。腳本程序分兩類,一類是自己寫的,另類就是系統內置在瀏覽器中的,就是所謂的[Native Code]。后者的效率當然是遠高于前者,這大家都知道。所以盡可能多讓代碼交給系統執行,有時看起來可能計算量變大了,但最終的速度反倒提升了。

  就說BASE64解碼的過程,參數是個String,按常規的方法就是先charAt其每個字符。如果有1萬個字符,那么charAt也就運行了1萬次。能否將多次charAt函數的執行合并到1次本地代碼的調用上呢,當然可以:

  var arr = str.split('');

  之后的str.charAt(i)就可以用arr[i]代替了。此方法雖多開辟的一塊內存,但最終的效率還是有所提高,并且增強了代碼可讀性。當然,在運行速度極快的瀏覽器比如FireFox,Chrome就沒什么區別,甚至還可能倒退。

  最后就是一個層次上的問題。網上常有人在說BASE64如何支持中文。按照這種說法,BASE64用來編碼解碼字符串了,這與其意義多少有些偏離。BASE64的最初就是將二進制文件轉成可見字符,在郵件里發送。因此其意義就在于二進制與字符的轉換,而不是字符與字符的轉換。JS沒有二進制,但可以用0-255的數組來模擬。所以:

  function 編碼函數(Array[]){return String;}

  function 解碼函數(String){return Array[];}

  至于中文的問題,無非就是Unicode與ANSI的轉換。JS貌似沒有現成的轉換函數,若要實現可以用Unicode與ANSI的對照表。但雙方的編碼/解碼都統一使用Unicode,也就

  不存在支不支持的問題了。

  最終的代碼:

以下為引用的內容:
<script>
var mapEn = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split('');
var mapDe = {};

for(var i=0; i<64; i++)
mapDe[mapEn[i]] = i;

/*
* 函數: Base64Encode
* 說明: 編碼
* 教程:網liehuo.net
*/
function Base64Encode(data)
{
var buf = [];
var map = mapEn;
var n = data.length; //總字節數
var val; //中間值
var i = 0;

/*
* 3字節 ==> val ==> 4字符
*/
while(i < n)
{
val = (data[ i ] << 16) |
(data[i+1] << 8) |
(data[i+2]);

buf.push(map[val>>18],
map[val>>12 & 63],
map[val>>6 & 63],
map[val & 63]);
i += 3;
}

if(n%3 == 1) //湊兩個"="
buf.pop(),buf.pop(),buf.push('=', '=');
else //湊一個"="
buf.pop(),buf.push('=');

return buf.join('');
}

/*
* 函數: Base64Decode
* 說明: 解碼
*/
function Base64Decode(str)
{
var buf = [];
var arr = str.split('');
var map = mapDe;
var n = arr.length; //總字符數
var val; //中間值
var i=0;

/*
* 長度異常
*/
if(n % 4)
return;

/*
* 4字符 ==> val ==> 3字節
*/
while(i < n)
{
val = (map[arr[ i ]] << 18) |
(map[arr[i+1]] << 12) |
(map[arr[i+2]] << 6) |
(map[arr[i+3]]);

buf.push(val>>16,
val>>8 & 0xFF,
val & 0xFF);
i += 4;
}

/*
* 湊字字符"="個數
*/
while(arr[--n] == '=')
buf.pop();

return buf;
}
</script>

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产精品一区二区久久 | 成人欧美一区二区三区在线播放 | 亚洲精品视频在线观看视频 | 亚洲免费在线看 | 国产精品电影一区二区三区 | a天堂视频 | 激情五月激情综合网 | 99久久99久国产黄毛片 | 日韩免费电影在线观看 | 久久91精品国产91久久跳 | 日韩二区 | 精品亚洲一区二区三区 | 亚洲一区 中文字幕 | 污视频链接 | 亚洲国产精品一区 | 日韩爆操 | 日韩网站免费观看 | 成人毛片在线播放器 | 中文字幕 在线观看 | 久久中文字幕免费 | 成人黄色免费视频 | 日本大乳肥臀一级毛片 | 国产精品久久久久久久9999 | 一区二区三区四区在线播放 | 中文字幕无线精品亚洲乱码一区 | 国产精品日韩av | 久久久久国产一区二区三区 | 日韩视频一级 | 国产精品片在线观看 | 欧美日韩一二三四区 | 日韩av网站在线观看 | 一区精品在线 | 国产91免费看 | 台湾av在线 | 成人免费黄色 | 亚洲免费小视频 | 欧美成人一区二区三区 | 99精品国产在热久久婷婷 | 久久国产a | 亚洲国产福利 | 在线播放av网站 |