精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JavaScript:詳解Base64編碼和解碼

開發 前端
Base64是最常用的編碼之一,比如開發中用于傳遞參數、現代瀏覽器中的<img />標簽直接通過Base64字符串來渲染圖片以及用于郵件中等等。Base64編碼在RFC2045中定義,它被定義為:Base64內容傳送編碼被設計用來把任意序列的8位字節描述為一種不易被人直接識別的形式。

Base64是最常用的編碼之一,比如開發中用于傳遞參數、現代瀏覽器中的<img />標簽直接通過Base64字符串來渲染圖片以及用于郵件中等等。Base64編碼在RFC2045中定義,它被定義為:Base64內容傳送編碼被設計用來把任意序列的8位字節描述為一種不易被人直接識別的形式。

我們知道,任何數據在計算機中都是以二進制的方式存儲的。一個字節為8位,一個字符在計算機中存儲為一個或多個字節,比如英文字母、數字以及英文標點符號就是用一個 字節來存儲的,通常稱為ASCII碼。而簡體中文、繁體中文、日文以及韓文等都是用多字節來存儲的,通常稱為多字節字符。因為Base64編碼是對字符串的編碼表示進行處理的,不同編碼的字符串的Base64的結果是不同的,所以我們需要了解基本的字符編碼知識。

 

字符編碼基礎

計算機最開始只支持ASCII碼,一個字符用一個字節表示,只用了低7位,***位為0,因此總共有128個ASCII碼,范圍為0~127。后來為了支持多種地區的語言,各大組織機構和IT廠商開始發明它們自己的編碼方案,以便彌補ASCII編碼的不足,如GB2312編碼、GBK編碼和Big5編碼等。但這些編碼都只是針對局部地區或少數語言文字,沒有辦法表達所有的語言文字。而且這些不同的編碼之間并沒有任何聯系,它們之間的轉換需要通過查表來實現。
 

為了提高計算機的信息處理和交換功能,使得世界各國的文字都能在計算機中處理,從1984年起,ISO組織就開始研究制定一個全新的標準:通用多八位(即多字節)編碼字符集(Universal Multiple-Octet Coded Character Set),簡稱UCS。標準的編號為:ISO 10646。這一標準為世界各種主要語言的字符(包括簡體及繁體的中文字)及附加符號,編制統一的內碼。

統一碼(Unicode)是Universal Code的縮寫,是由另一個叫“Unicode學術學會”(The Unicode Consortium)的機構制定的字符編碼系統。Unicode與ISO 10646國際編碼標準從內容上來說是同步一致的。具體可參考:Unicode 。

 

ANSI

ANSI不代表具體的編碼,它是指本地編碼。比如在簡體版windows上它表示GB2312編碼,在繁體版windows上它表示Big5編碼,在日文操作系統上它表示JIS編碼。所以如果您新建了個文本文件并保存為ANSI編碼,那么您現在應該知道這個文件的編碼為本地編碼。
 

 

Unicode

Unicode編碼是和字符表一一映射的。比如56DE代表漢字'回',這種映射關系是固定不變的。通俗的說Unicode編碼就是字符表的坐標,通過56DE就能找到漢字'回'。Unicode編碼的實現包括UTF8、UTF16、UTF32等等。

Unicode本身定義的就是每個字符的數值,是字符和自然數的映射關系,而UTF-8或者UTF-16甚至UTF-32則定義了如何在字節流中斷字,是計算機領域的概念。

通過上圖我們知道,UTF-8編碼為變長的編碼方式,占1~6個字節,可通過Unicode編碼值的區間來判斷,并且每個組成UTF8字符的字節都是有規律可循的。本文只討論UTF8和UTF16這兩種編碼。
 

 

UTF16

UTF16編碼使用固定的2個字節來存儲。因為是多字節存儲,所以它的存儲方式分為2種:大端序和小端序。UTF16編碼是Unicode最直接的實現方式,通常我們在windows上新建文本文件后保存為Unicode編碼,其實就是保存為UTF16編碼。UTF16編碼在windows上采用小端序的方式存儲,以下我新建了個文本文件并保存為Unicode編碼來測試,文件中只輸入了一個漢字'回',之后我用Editplus打開它,切換到十六進制方式查看,如圖所示:

我們看到有4個字節,前2個字節FF FE是文件頭,表示這是一個UTF16編碼的文件,而DE 56則是'回'的UTF16編碼的十六進制。我們經常使用的JavaScript語言,它內部就是采用UTF16編碼,并且它的存儲方式為大端序,來看一個例子:

  1. <script type="text/javascript">  
  2. console.group('Test Unicode: ');  
  3. console.log(('回'.charCodeAt(0)).toString(16).toUpperCase());  
  4. </script>  

很明顯跟剛才Editplus顯示的不一樣,順序是相反的,這是因為字節序不一樣。具體可參考:UTF-16

 

UTF8

UTF8是采用變長的編碼方式,為1~6個字節,但通常我們只把它看作單字節或三字節的實現,因為其它情況實在少見。UTF8編碼通過多個字節組合的方式來顯示,這是計算機處理UTF8的機制,它是無字節序之分的,并且每個字節都非常有規律,詳見上圖,在此不再詳述。
 

 

UTF16和UTF8的相互轉換

 

UTF16轉UTF8

UTF16和UTF8之間的相互轉換可以通過上圖的轉換表來實現,判斷Unicode碼所在的區間就可以得到這個字符是由幾個字節所組成,之后通過移位來實現。我們用漢字'回'來舉一個轉換的例子。

我們已經知道漢字'回'的Unicode碼是0x56DE,它介于U+00000800 – U+0000FFFF之間,所以它是用三個字節來表示的。

所以我們需要將0x56DE這個雙字節的值變為三字節的值,注意上圖中的x部分,就是對應0x56DE的各位字節,如果您數一下x的個數,會發現剛好是16位。

 

轉換思路

從0x56DE中取出4位放在低位,并和二進制的1110結合,這就是***個字節。從0x56DE中剩下的字節中取出6位放在低位,并和二進制的10結合,這就是第二個字節。第三個字節依照類似的方式實現。
 

 

代碼實現

為了讓大家更好的理解,以下代碼只是實現漢字'回'的轉換,代碼如下:

  1. <script type="text/javascript">  
  2. /**  
  3. * 轉換對照表  
  4. * U+00000000 – U+0000007F   0xxxxxxx  
  5. * U+00000080 – U+000007FF   110xxxxx 10xxxxxx  
  6. * U+00000800 – U+0000FFFF   1110xxxx 10xxxxxx 10xxxxxx  
  7. * U+00010000 – U+001FFFFF   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  
  8. * U+00200000 – U+03FFFFFF   111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
  9. * U+04000000 – U+7FFFFFFF   1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
  10. */ 
  11. /*  
  12. * '回'的Unicode編碼為:0x56DE,它介于U+00000800 – U+0000FFFF之間,所以它占用三個字節。  
  13. * U+00000800 – U+0000FFFF   1110xxxx 10xxxxxx 10xxxxxx  
  14. */ 
  15. var ucode = 0x56DE;  
  16. // 1110xxxx  
  17. var byte1 = 0xE0 | ((ucode >> 12) & 0x0F);  
  18. // 10xxxxxx  
  19. var byte2 = 0x80 | ((ucode >> 6) & 0x3F);  
  20. // 10xxxxxx  
  21. var byte3 = 0x80 | (ucode & 0x3F);  
  22. var utf8 = String.fromCharCode(byte1)  
  23.         + String.fromCharCode(byte2)  
  24.         + String.fromCharCode(byte3);  
  25.  
  26. console.group('Test UTF16ToUTF8: ');  
  27. console.log(utf8);  
  28. console.groupEnd();  
  29. </script>  

輸出的結果看起來像亂碼,這是因為JavaScript不知道如何顯示UTF8的字符。您或許會說輸出不正常轉換還有什么用,但您應該知道轉換的目的還經常用于傳輸或API的需要。

 

UTF8轉UTF16

這是UTF16轉換到UTF8的逆轉換,同樣需要對照轉換表來實現。還是接上一個例子,我們已經得到了漢字'回'的UTF8編碼,這是三個字節的,我們只需要按照轉換表來轉成雙字節的,如圖所示,我們需要保留下所有的x。
 

代碼如下:

  1. <script type="text/javascript">  
  2. /**  
  3. * 轉換對照表  
  4. * U+00000000 – U+0000007F   0xxxxxxx  
  5. * U+00000080 – U+000007FF   110xxxxx 10xxxxxx  
  6. * U+00000800 – U+0000FFFF   1110xxxx 10xxxxxx 10xxxxxx  
  7. * U+00010000 – U+001FFFFF   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  
  8. * U+00200000 – U+03FFFFFF   111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
  9. * U+04000000 – U+7FFFFFFF   1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
  10. */ 
  11. /*  
  12. * '回'的Unicode編碼為:0x56DE,它介于U+00000800 – U+0000FFFF之間,所以它占用三個字節。  
  13. * U+00000800 – U+0000FFFF   1110xxxx 10xxxxxx 10xxxxxx  
  14. */ 
  15. var ucode = 0x56DE;  
  16. // 1110xxxx  
  17. var byte1 = 0xE0 | ((ucode >> 12) & 0x0F);  
  18. // 10xxxxxx  
  19. var byte2 = 0x80 | ((ucode >> 6) & 0x3F);  
  20. // 10xxxxxx  
  21. var byte3 = 0x80 | (ucode & 0x3F);  
  22. var utf8 = String.fromCharCode(byte1)  
  23.         + String.fromCharCode(byte2)  
  24.         + String.fromCharCode(byte3);  
  25.  
  26. console.group('Test UTF16ToUTF8: ');  
  27. console.log(utf8);  
  28. console.groupEnd();  
  29. /** ------------------------------------------------------------------------------------*/ 
  30. // 由三個字節組成,所以分別取出  
  31. var c1 = utf8.charCodeAt(0);  
  32. var c2 = utf8.charCodeAt(1);  
  33. var c3 = utf8.charCodeAt(2);  
  34. /*  
  35. * 需要通過判斷特定位的方式來轉換,但這里是已知是三個字節,所以忽略判斷,而是直接拿到所有的x,組成16位。  
  36. * U+00000800 – U+0000FFFF   1110xxxx 10xxxxxx 10xxxxxx  
  37. */ 
  38. // 丟棄***個字節的高四位并和第二個字節的高四位組成一個字節  
  39. var b1 = (c1 << 4) | ((c2 >> 2) & 0x0F);  
  40. // 同理第二個字節和第三個字節組合  
  41. var b2 = ((c2 & 0x03) << 6) | (c3 & 0x3F);  
  42. // 將b1和b2組成16位  
  43. var ucode = ((b1 & 0x00FF) << 8) | b2;  
  44. console.group('Test UTF8ToUTF16: ');  
  45. console.log(ucode.toString(16).toUpperCase(), String.fromCharCode(ucode));  
  46. console.groupEnd();  
  47. </script> 

知道了轉換規則,就很容易實現了。

 

Base64編碼

Base64編碼要求把3個8位字節(3*8=24)轉化為4個6位的字節(4*6=24),之后在6位的前面補兩個0,形成8位一個字節的形式。由于2的6次方為64,所以每6個位為一個單元,對應某個可打印字符。當原數據不是3的整數倍時,如果***剩下兩個輸入數據,在編碼結果后加1個“=;如果***剩下一個輸入數據,編碼結果后加2個“=;如果沒有剩下任何數據,就什么都不要加,這樣才可以保證資料還原的正確性。

 

轉碼對照表

每6個單元高位補2個零形成的字節位于0~63之間,通過在轉碼表中查找對應的可打印字符。“=”用于填充。如下圖所示為轉碼表。
 

具體可參考: Base64

#p#

 

Base64解碼

解碼是編碼的逆過程,先看后面補了幾個“=”號,最多只可能補2個“=”號。一個“=”相當于補了2個0,所以去掉后面補的0后,再按8位展開,即可還原。

 

JavaScript實現Base64的編碼和解碼

之前已經詳細講解了整個過程,本文的例子都是采用UTF8編碼的字符串作為Base64編碼的基礎。因為JavaScript內部是使用Unicode編碼,所以需要有個轉換過程,原理之前也詳細講解過并給出了示例,以下是代碼實現:

  1. <script type="text/javascript">  
  2. /**  
  3. * UTF16和UTF8轉換對照表  
  4. * U+00000000 – U+0000007F   0xxxxxxx  
  5. * U+00000080 – U+000007FF   110xxxxx 10xxxxxx  
  6. * U+00000800 – U+0000FFFF   1110xxxx 10xxxxxx 10xxxxxx  
  7. * U+00010000 – U+001FFFFF   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  
  8. * U+00200000 – U+03FFFFFF   111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
  9. * U+04000000 – U+7FFFFFFF   1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
  10. */ 
  11. var Base64 = {  
  12.     // 轉碼表  
  13.     table : [  
  14.             'A''B''C''D''E''F''G''H',  
  15.             'I''J''K''L''M''N''O' ,'P',  
  16.             'Q''R''S''T''U''V''W''X',  
  17.             'Y''Z''a''b''c''d''e''f',  
  18.             'g''h''i''j''k''l''m''n',  
  19.             'o''p''q''r''s''t''u''v',  
  20.             'w''x''y''z''0''1''2''3',  
  21.             '4''5''6''7''8''9''+''/' 
  22.     ],  
  23.     UTF16ToUTF8 : function(str) {  
  24.         var res = [], len = str.length;  
  25.         for (var i = 0; i < len; i++) {  
  26.             var code = str.charCodeAt(i);  
  27.             if (code > 0x0000 && code <= 0x007F) {  
  28.                 // 單字節,這里并不考慮0x0000,因為它是空字節  
  29.                 // U+00000000 – U+0000007F  0xxxxxxx  
  30.                 res.push(str.charAt(i));  
  31.             } else if (code >= 0x0080 && code <= 0x07FF) {  
  32.                 // 雙字節  
  33.                 // U+00000080 – U+000007FF  110xxxxx 10xxxxxx  
  34.                 // 110xxxxx  
  35.                 var byte1 = 0xC0 | ((code >> 6) & 0x1F);  
  36.                 // 10xxxxxx  
  37.                 var byte2 = 0x80 | (code & 0x3F);  
  38.                 res.push(  
  39.                     String.fromCharCode(byte1),   
  40.                     String.fromCharCode(byte2)  
  41.                 );  
  42.             } else if (code >= 0x0800 && code <= 0xFFFF) {  
  43.                 // 三字節  
  44.                 // U+00000800 – U+0000FFFF  1110xxxx 10xxxxxx 10xxxxxx  
  45.                 // 1110xxxx  
  46.                 var byte1 = 0xE0 | ((code >> 12) & 0x0F);  
  47.                 // 10xxxxxx  
  48.                 var byte2 = 0x80 | ((code >> 6) & 0x3F);  
  49.                 // 10xxxxxx  
  50.                 var byte3 = 0x80 | (code & 0x3F);  
  51.                 res.push(  
  52.                     String.fromCharCode(byte1),   
  53.                     String.fromCharCode(byte2),   
  54.                     String.fromCharCode(byte3)  
  55.                 );  
  56.             } else if (code >= 0x00010000 && code <= 0x001FFFFF) {  
  57.                 // 四字節  
  58.                 // U+00010000 – U+001FFFFF  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  
  59.             } else if (code >= 0x00200000 && code <= 0x03FFFFFF) {  
  60.                 // 五字節  
  61.                 // U+00200000 – U+03FFFFFF  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
  62.             } else /** if (code >= 0x04000000 && code <= 0x7FFFFFFF)*/ {  
  63.                 // 六字節  
  64.                 // U+04000000 – U+7FFFFFFF  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
  65.             }  
  66.         }  
  67.  
  68.         return res.join('');  
  69.     },  
  70.     UTF8ToUTF16 : function(str) {  
  71.         var res = [], len = str.length;  
  72.         var i = 0;  
  73.         for (var i = 0; i < len; i++) {  
  74.             var code = str.charCodeAt(i);  
  75.             // 對***個字節進行判斷  
  76.             if (((code >> 7) & 0xFF) == 0x0) {  
  77.                 // 單字節  
  78.                 // 0xxxxxxx  
  79.                 res.push(str.charAt(i));  
  80.             } else if (((code >> 5) & 0xFF) == 0x6) {  
  81.                 // 雙字節  
  82.                 // 110xxxxx 10xxxxxx  
  83.                 var code2 = str.charCodeAt(++i);  
  84.                 var byte1 = (code & 0x1F) << 6;  
  85.                 var byte2 = code2 & 0x3F;  
  86.                 var utf16 = byte1 | byte2;  
  87.                 res.push(Sting.fromCharCode(utf16));  
  88.             } else if (((code >> 4) & 0xFF) == 0xE) {  
  89.                 // 三字節  
  90.                 // 1110xxxx 10xxxxxx 10xxxxxx  
  91.                 var code2 = str.charCodeAt(++i);  
  92.                 var code3 = str.charCodeAt(++i);  
  93.                 var byte1 = (code << 4) | ((code2 >> 2) & 0x0F);  
  94.                 var byte2 = ((code2 & 0x03) << 6) | (code3 & 0x3F);  
  95.                 utf16 = ((byte1 & 0x00FF) << 8) | byte2  
  96.                 res.push(String.fromCharCode(utf16));  
  97.             } else if (((code >> 3) & 0xFF) == 0x1E) {  
  98.                 // 四字節  
  99.                 // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  
  100.             } else if (((code >> 2) & 0xFF) == 0x3E) {  
  101.                 // 五字節  
  102.                 // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
  103.             } else /** if (((code >> 1) & 0xFF) == 0x7E)*/ {  
  104.                 // 六字節  
  105.                 // 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
  106.             }  
  107.         }  
  108.  
  109.         return res.join('');  
  110.     },  
  111.     encode : function(str) {  
  112.         if (!str) {  
  113.             return '';  
  114.         }  
  115.         var utf8    = this.UTF16ToUTF8(str); // 轉成UTF8  
  116.         var i = 0; // 遍歷索引  
  117.         var len = utf8.length;  
  118.         var res = [];  
  119.         while (i < len) {  
  120.             var c1 = utf8.charCodeAt(i++) & 0xFF;  
  121.             res.push(this.table[c1 >> 2]);  
  122.             // 需要補2個=  
  123.             if (i == len) {  
  124.                 res.push(this.table[(c1 & 0x3) << 4]);  
  125.                 res.push('==');  
  126.                 break;  
  127.             }  
  128.             var c2 = utf8.charCodeAt(i++);  
  129.             // 需要補1個=  
  130.             if (i == len) {  
  131.                 res.push(this.table[((c1 & 0x3) << 4) | ((c2 >> 4) & 0x0F)]);  
  132.                 res.push(this.table[(c2 & 0x0F) << 2]);  
  133.                 res.push('=');  
  134.                 break;  
  135.             }  
  136.             var c3 = utf8.charCodeAt(i++);  
  137.             res.push(this.table[((c1 & 0x3) << 4) | ((c2 >> 4) & 0x0F)]);  
  138.             res.push(this.table[((c2 & 0x0F) << 2) | ((c3 & 0xC0) >> 6)]);  
  139.             res.push(this.table[c3 & 0x3F]);  
  140.         }  
  141.  
  142.         return res.join('');  
  143.     },  
  144.     decode : function(str) {  
  145.         if (!str) {  
  146.             return '';  
  147.         }  
  148.  
  149.         var len = str.length;  
  150.         var i   = 0;  
  151.         var res = [];  
  152.  
  153.         while (i < len) {  
  154.             code1 = this.table.indexOf(str.charAt(i++));  
  155.             code2 = this.table.indexOf(str.charAt(i++));  
  156.             code3 = this.table.indexOf(str.charAt(i++));  
  157.             code4 = this.table.indexOf(str.charAt(i++));  
  158.  
  159.             c1 = (code1 << 2) | (code2 >> 4);  
  160.             c2 = ((code2 & 0xF) << 4) | (code3 >> 2);  
  161.             c3 = ((code3 & 0x3) << 6) | code4;  
  162.  
  163.             res.push(String.fromCharCode(c1));  
  164.  
  165.             if (code3 != 64) {  
  166.                 res.push(String.fromCharCode(c2));  
  167.             }  
  168.             if (code4 != 64) {  
  169.                 res.push(String.fromCharCode(c3));  
  170.             }  
  171.  
  172.         }  
  173.  
  174.         return this.UTF8ToUTF16(res.join(''));  
  175.     }  
  176. };  
  177.  
  178. console.group('Test Base64: ');  
  179. var b64 = Base64.encode('Hello, oschina!又是一年春來到~');  
  180. console.log(b64);  
  181. console.log(Base64.decode(b64));  
  182. console.groupEnd();  
  183. </script>  

不得不說,在JavaScript中實現確實很麻煩。我們來看下PHP對同樣的字符串編碼的結果:

因為字符編碼是一樣的,所以結果也一樣。

原文鏈接:http://my.oschina.net/goal/blog/201032

責任編輯:林師授 來源: 中國開源社區
相關推薦

2022-10-29 19:58:09

Base64Bashshell

2023-03-01 11:02:12

2024-07-31 10:22:49

Go語言編碼

2021-09-07 08:59:09

編碼Base64解碼

2024-07-11 08:42:57

2025-02-11 00:00:10

Base64編碼二進制

2024-02-28 23:07:42

GolangBase64編碼

2021-03-05 09:10:19

base64編碼

2019-08-09 11:40:38

JavaScriptCSS技術

2023-11-07 08:35:26

2022-06-06 08:31:05

Base64編碼Base58

2019-07-23 08:55:46

Base64編碼底層

2016-12-13 13:50:06

JAVA轉換Base64

2021-02-05 05:26:33

字節ASCII控制

2021-11-25 08:11:47

JS網站信息

2010-03-03 16:14:05

Python base

2021-08-26 05:27:08

Base64 字節流算法

2025-04-23 00:04:00

2023-01-26 00:31:25

ASCIIBase64UTF-8

2020-12-21 06:58:12

Web安全編解碼工具
點贊
收藏

51CTO技術棧公眾號

精品久久香蕉国产线看观看亚洲| 久久精品盗摄| 欧美成人欧美edvon| 日韩精品一区二区免费| 欧洲一区av| 激情亚洲综合在线| 97婷婷大伊香蕉精品视频| 色欲AV无码精品一区二区久久| 亚洲精品tv| 欧美性少妇18aaaa视频| 视频在线观看成人| 欧美一区,二区| 日韩国产一区二| 久久久久国产精品www| 日韩欧美黄色网址| 国内精品偷拍| 欧美一级欧美三级| 国内自拍视频网| 成人性生交大片免费看网站| 久久久不卡影院| 肥熟一91porny丨九色丨| 日本视频www色| 国产精品综合色区在线观看| 久久国产精品久久国产精品| 免费看日本黄色片| 日韩美女精品| 精品奇米国产一区二区三区| 在线观看岛国av| 欧美自拍电影| 精品久久久久久久久久国产| 米仓穗香在线观看| 日本在线视频网| 国产性色一区二区| 乱一区二区三区在线播放| www.热久久| 国产精品一区二区你懂的| 国产成人精品久久| 国产午夜性春猛交ⅹxxx| 欧美特黄一区| 久久天天躁狠狠躁夜夜av| 国产激情av在线| 亚洲精品3区| 日韩第一页在线| 三级视频网站在线观看| 第一区第二区在线| 91精品国产欧美一区二区成人| 一区二区三区视频网| 国产精品亚洲d| 色婷婷久久99综合精品jk白丝| 极品粉嫩国产18尤物| 另类视频在线| 亚洲一卡二卡三卡四卡五卡| 久久久久久久香蕉| 色婷婷av在线| 亚洲一区二区四区蜜桃| 国内少妇毛片视频| 啊啊啊久久久| 粉嫩av一区二区三区免费野| 成人综合视频在线| 亚洲美女久久精品| 在线观看亚洲a| 国产免费视频传媒| 青青伊人久久| 日韩视频免费观看高清完整版 | 国产盗摄——sm在线视频| 亚洲最大色网站| 分分操这里只有精品| 搞黄网站在线看| 天天av天天翘天天综合网色鬼国产 | 亚洲区综合中文字幕日日| 久久亚洲精品国产亚洲老地址| 侵犯稚嫩小箩莉h文系列小说| 97久久视频| 欧美成在线视频| 日韩乱码一区二区| 久久精品日产第一区二区| 国产精品网站视频| 99热精品在线播放| a级精品国产片在线观看| 久久精品一区二区三区不卡免费视频| 狠狠色伊人亚洲综合网站l| 国产精品视频yy9299一区| 蜜桃视频成人在线观看| 毛片大全在线观看| 在线观看视频一区二区欧美日韩| 性欧美在线视频| 欧美jizz19性欧美| 中文字幕亚洲欧美日韩2019| 麻豆视频在线观看| 美女黄网久久| 91精品久久久久久蜜桃| 性猛交xxxx| 国产精品免费久久| 国产精品www在线观看| 亚洲成人激情社区| 欧美一级片免费看| 国产高潮呻吟久久| 欧美精品偷拍| 国产91精品在线播放| 国产高清在线免费| 日本一区二区视频在线观看| 成人午夜免费在线视频| yiren22亚洲综合| 亚洲精品国产精品国自产观看浪潮| 免费看91的网站| 亚洲激情网站| 91久久在线观看| 日本成人一区二区三区| 亚洲精品乱码久久久久久日本蜜臀| 国产福利视频在线播放| 国产偷人妻精品一区| 青青青国产在线观看| 牛牛精品在线视频| 欧美三级视频在线观看| 日韩成人av一区二区| 久久久9色精品国产一区二区三区| 97在线视频免费播放| 一级特黄特色的免费大片视频| av一区二区三区| 日韩一级免费看| free欧美| 精品无人区乱码1区2区3区在线| 超碰在线国产97| 青草国产精品久久久久久| 久久爱av电影| 9765激情中文在线| 欧美一区二区私人影院日本| 性高潮久久久久久久| 9国产精品视频| 国产成人免费电影| 午夜成年人在线免费视频| 欧美日韩国产乱码电影| 影音先锋男人在线| 噜噜噜91成人网| 免费看成人午夜电影| av资源中文在线| 精品国产99国产精品| 久久免费播放视频| 国产成人午夜电影网| 看一级黄色录像| 91嫩草国产线观看亚洲一区二区| 中文字幕在线观看日韩| 中文字幕欧美在线观看| 欧美激情一区二区| 男人添女人下面免费视频| 成人亚洲一区二区| 国产精品国模在线| 亚洲天天影视| 91精品国产综合久久香蕉的特点| 自拍偷拍第9页| 久久精品国产99国产| 一区二区三区不卡在线| 色综合.com| 久久天天躁狠狠躁夜夜爽蜜月| 国产精品毛片一区二区在线看舒淇| 日本一区二区不卡视频| 国产又猛又黄的视频| 日韩黄色大片| 成人免费自拍视频| 视频在线这里都是精品| 亚洲国产成人久久综合一区| 日韩精品成人一区| 久久婷婷综合激情| 999精品视频在线| 国产精品99视频| 666精品在线| av中文字幕在线观看第一页| 亚洲欧美三级在线| 做爰视频毛片视频| 亚洲色图另类专区| 男人的天堂影院| 老司机精品久久| 一区二区免费在线观看| 爱高潮www亚洲精品| 青草成人免费视频| 麻豆传媒视频在线观看免费| 日韩免费高清av| 日韩综合在线观看| 亚洲视频免费在线| 日韩精品人妻中文字幕有码| 久久一区激情| 久久国产精品免费观看| 欧美aaaaa级| 91精品久久久久久久久青青 | 日本熟妇人妻xxxxx| 成人动漫免费在线观看| 91精品国产高清久久久久久91裸体| 岛国av在线网站| 中文字幕欧美日韩| 色婷婷av一区二区三区之e本道| 欧美性生交片4| 精品无码人妻一区二区三| 国产欧美一区二区精品性色超碰| 天天爽夜夜爽视频| 久热精品在线| 国产www免费| 欧美1级片网站| 狠狠综合久久av| 亚洲成人a级片| 日本韩国欧美精品大片卡二| 岛国成人毛片| 国产午夜精品视频免费不卡69堂| 国产黄色片av| 欧美日韩成人综合| 国产精品视频一区在线观看| 亚洲精品日日夜夜| 舐め犯し波多野结衣在线观看| 国产精品一区二区久久不卡| 波多野结衣天堂| 国产日韩一区二区三区在线| 黄色一级片网址| 日本一区二区高清不卡| 久久天天狠狠| 成人激情自拍| 亚洲一区二区在线播放| 国产综合av| 茄子视频成人在线| 男人天堂视频在线观看| 欧美夫妻性视频| 麻豆av在线导航| 色小说视频一区| 美女毛片在线看| 日韩精品免费综合视频在线播放| aaa一区二区| 777午夜精品免费视频| 99热只有这里有精品| 亚洲国产一区二区a毛片| 夫妻性生活毛片| 中文字幕五月欧美| 午夜精品久久久久99蜜桃最新版| 久久久久国色av免费看影院| 国产美女视频免费观看下载软件| 国产老女人精品毛片久久| 中文字幕中文在线| 麻豆视频一区二区| 中文字幕亚洲乱码| 免费成人性网站| 91人人澡人人爽人人精品| 丝袜a∨在线一区二区三区不卡| 日本免费不卡一区二区| 国产日韩欧美一区在线| 日韩a级在线观看| 激情久久久久| 内射国产内射夫妻免费频道| 精品1区2区3区4区| 又大又硬又爽免费视频| 尹人成人综合网| 成人免费观看cn| 国产精品夜夜夜| 丝袜老师办公室里做好紧好爽| 国产一级久久| 毛片一区二区三区四区| 久久中文字幕一区二区三区| 国产精品动漫网站| 日av在线不卡| 婷婷激情5月天| 国产伦精品一区二区三区视频青涩| 午夜视频在线观| 国产高清无密码一区二区三区| 绯色av蜜臀vs少妇| www.色精品| 无码国产69精品久久久久同性| 国产欧美一区二区精品秋霞影院 | 一本高清dvd不卡在线观看| 7799精品视频天天看| 色狠狠色狠狠综合| 在线免费看av的网站| 日韩欧美一区中文| 亚洲人成色777777精品音频| 国产亚洲美女久久| 国产成人高清精品| 久久人91精品久久久久久不卡 | 91精品免费视频| 97久久综合区小说区图片区| 国内一区二区在线视频观看| 久久最新网址| 欧美一级免费在线观看| 亚洲激情网站| 另类小说第一页| 成人永久aaa| 黄色片网站免费| 亚洲午夜精品网| 波多野结衣高清在线| 日韩欧美一区二区久久婷婷| 深夜福利在线看| www.久久撸.com| 日韩伦理在线一区| 91久久中文字幕| 国产精选一区| 青青青在线观看视频| 日产国产欧美视频一区精品| 国产精品日日摸夜夜爽| 国产亚洲一区字幕| 久青草免费视频| 欧美日韩国产a| 五月婷婷在线播放| 不卡av电影院| 日韩欧美精品电影| 精品国产一二| 亚洲成人三区| 欧美伦理片在线看| jlzzjlzz亚洲日本少妇| 国产精品国产精品88| 日韩欧美在线观看| 免费观看毛片网站| 波霸ol色综合久久| 免费电影日韩网站| 国产精品美女xx| 欧美一区91| 亚洲第一区第二区第三区| 久久精品日韩一区二区三区| 色播视频在线播放| 欧美一级久久久| 黄在线免费观看| 国产精品久久一区| 啄木系列成人av电影| 天天夜碰日日摸日日澡性色av| 精东粉嫩av免费一区二区三区| 成人在线一级片| 精品欧美国产一区二区三区| www.天堂av.com| 久久亚洲春色中文字幕| 欧美一级做a| 亚洲国产欧美日韩| 日韩激情中文字幕| japanese中文字幕| 色香蕉成人二区免费| 欧美xxx.com| 日韩av成人在线观看| 亚州国产精品| 无码人妻h动漫| 久久久综合网站| 人妻 日韩精品 中文字幕| 日韩av在线不卡| 一区二区精品伦理...| 国产三级精品在线不卡| 亚洲国产一区二区三区a毛片| 日本少妇一级片| 亚洲成人免费影院| 免费国产黄色片| 欧美一级片免费在线| 亚洲亚洲免费| 日本老熟妇毛茸茸| 日本一区二区三区久久久久久久久不| 亚洲中文一区二区| 亚洲最大中文字幕| 成人在线视频观看| 一区二区视频在线观看| 精品一区二区三区在线播放| 欧美视频一区二区在线| 91精品国产综合久久精品app | 日韩一区欧美| 精品国产乱码久久久久久1区二区| 最新久久zyz资源站| а√天堂资源在线| 97久久精品人人澡人人爽缅北| 亚洲香蕉视频| 老司机久久精品| 亚洲精品中文在线观看| 亚洲精品综合久久| 欧美一区视频在线| 日韩伦理一区| 伊人久久久久久久久| 午夜久久久久久久久久一区二区| 三级做a全过程在线观看| 国产91精品在线播放| 91九色精品| 精品1卡二卡三卡四卡老狼| 欧美性感美女h网站在线观看免费| 国产www.大片在线| 亚洲一区二区免费在线| 国产亚洲在线| 一级性生活免费视频| 亚洲电影在线看| 丝袜美腿一区| 久久久久福利视频| 91丨九色丨蝌蚪丨老版| 中文字幕在线观看你懂的| 欧美日韩高清区| 岳的好大精品一区二区三区| 亚洲a级黄色片| 大桥未久av一区二区三区| 日韩三级影院| 九色91视频| 精品一区二区久久| 日韩少妇高潮抽搐| 久久久国产精品一区| 丝袜连裤袜欧美激情日韩| 蜜桃福利午夜精品一区| 欧美日韩在线视频一区| 黄色在线免费网站| 久久国产精品一区二区三区| 九九久久精品视频| 欧美在线观看不卡| 欧美成aaa人片免费看| 免费看成人吃奶视频在线| www.黄色网| 欧美日韩另类一区| 最近在线中文字幕| 成年人视频网站免费|