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

Go:不用標準庫如何解壓 Zip 文件?

開發 后端
我們來看看這里[1]定義的 zip 結構 。根據第 4.3.6 節,看起來文件元數據后跟文件內容一個接一個地存儲,最后一塊是 “central directory” 元數據。

[[439858]]

大家好,我是程序員幽鬼。

zip 是一種常見的歸檔格式,本文講解 Go 如何操作 zip。

首先看看 zip 文件是如何工作的。以一個小文件為例:(類 Unix 系統下)

  1. $ cat hello.text 
  2.  
  3. Hello! 

執行 zip 命令進行歸檔:

  1. $ zip test.zip hello.text 
  2.  
  3. adding: hello.text (stored 0%) 
  4.  
  5. $ ls -lah test.zip 
  6.  
  7. -rw-r--r-- 1 phil phil 177 Nov 23 23:04 test.zip 

一個 6 字節的文本文件變成了一個 177 字節的 zip 文件。這并不大,解析 177 個字節聽起來不可能太復雜!

對 zip 文件執行 hexdump:

  1. $ hexdump -C test.zip 
  2. 00000000  50 4b 03 04 0a 00 00 00  00 00 8a b8 77 53 9e d8  |PK..........wS..| 
  3. 00000010  42 b0 07 00 00 00 07 00  00 00 0a 00 1c 00 68 65  |B.............he| 
  4. 00000020  6c 6c 6f 2e 74 65 78 74  55 54 09 00 03 74 73 9d  |llo.textUT...ts.| 
  5. 00000030  61 74 73 9d 61 75 78 0b  00 01 04 eb 03 00 00 04  |ats.aux.........| 
  6. 00000040  eb 03 00 00 48 65 6c 6c  6f 21 0a 50 4b 01 02 1e  |....Hello!.PK...| 
  7. 00000050  03 0a 00 00 00 00 00 8a  b8 77 53 9e d8 42 b0 07  |.........wS..B..| 
  8. 00000060  00 00 00 07 00 00 00 0a  00 18 00 00 00 00 00 01  |................| 
  9. 00000070  00 00 00 a4 81 00 00 00  00 68 65 6c 6c 6f 2e 74  |.........hello.t| 
  10. 00000080  65 78 74 55 54 05 00 03  74 73 9d 61 75 78 0b 00  |extUT...ts.aux..| 
  11. 00000090  01 04 eb 03 00 00 04 eb  03 00 00 50 4b 05 06 00  |...........PK...| 
  12. 000000a0  00 00 00 01 00 01 00 50  00 00 00 4b 00 00 00 00  |.......P...K....| 
  13. 000000b0  00                                                |.| 
  14. 000000b1 

從中我們可以看到文件名和文件內容。

01 結構

我們來看看這里[1]定義的 zip 結構 。根據第 4.3.6 節,看起來文件元數據后跟文件內容一個接一個地存儲,最后一塊是 “central directory” 元數據。

zip format header

圖片來源:https://www.codeproject.com/Articles/8688/Extracting-files-from-a-remote-ZIP-archive

本地 header 元數據如下所示:

字段 大小
local file header signature 4 bytes
version needed to extract 2 bytes
general purpose bit flag 2 bytes
compression method 2 bytes
last mod file time 2 bytes
last mod file date 2 bytes
crc-32 4 bytes
compressed size 4 bytes
uncompressed size 4 bytes
file name length 2 bytes
extra field length 2 bytes
file name 可變
extra field 可變

在一個有效 zip 文件中,header 簽名是一個整數 (0x04034b50 )。我們將忽略版本、通用 flag 和校驗和。可以是沒有壓縮(用 0 表示),也可以是使用 DEFLATE 方法解壓縮(用 8 表示)。

最后修改時間和日期是 MSDOS 風格的日期/時間格式。

我們粗略地將其翻譯為 Go 代碼:

  1. package main 
  2.  
  3. import ( 
  4.     "os" 
  5.     "bytes" 
  6.     "compress/flate" 
  7.     "io/ioutil" 
  8.     "encoding/binary" 
  9.     "time" 
  10.     "fmt" 
  11.  
  12. type compression uint8 
  13. const ( 
  14.     noCompression compression = iota 
  15.     deflateCompression 
  16.  
  17. type localFileHeader struct { 
  18.     signature uint32 
  19.     version uint16 
  20.     bitFlag uint16 
  21.     compression compression 
  22.     lastModified time.Time 
  23.     crc32 uint32 
  24.     compressedSize uint32 
  25.     uncompressedSize uint32 
  26.     fileName string 
  27.     extraField []byte 
  28.     fileContents string 

02 main 函數實現

我們的入口點將讀取一個 zip 文件并遍歷該文件,直到我們無法解析 zip 文件條目。

  1. func main() { 
  2.     f, err := ioutil.ReadFile(os.Args[1]) 
  3.     if err != nil { 
  4.         panic(err) 
  5.     } 
  6.  
  7.     end := 0 
  8.     for end < len(f) { 
  9.         var err error 
  10.         var lfh *localFileHeader 
  11.         var next int 
  12.         lfh, next, err = parseLocalFileHeader(f, end
  13.         if err == errNotZip && end > 0 { 
  14.             break 
  15.         } 
  16.         if err != nil { 
  17.             panic(err) 
  18.         } 
  19.  
  20.         end = next 
  21.  
  22.         fmt.Println(lfh.lastModified, lfh.fileName, lfh.fileContents) 
  23.     } 

03 文件

對于每個文件,如果前四個字節不是魔術 zip 簽名(即 0x04034b50),則報錯。

  1. var errNotZip = fmt.Errorf("Not a zip file"
  2.  
  3. func parseLocalFileHeader(bs []byte, start int) (*localFileHeader, int, error) { 
  4.     signature, i, err := readUint32(bs, start) 
  5.     if signature != 0x04034b50 { 
  6.         return nil, 0, errNotZip 
  7.     } 
  8.     if err != nil { 
  9.         return nil, 0, err 
  10.     } 

基本模式是讀取輔助函數將獲取一個偏移量并返回一個 Go 值和一個新的偏移量。讀取輔助函數將進行邊界檢查。

遵循相同的模式直到結構體的末尾:

  1. version, i, err := readUint16(bs, i) 
  2. if err != nil { 
  3.     return nil, 0, err 
  4.  
  5. bitFlag, i, err := readUint16(bs, i) 
  6. if err != nil { 
  7.     return nil, 0, err 
  8.  
  9. compression := noCompression 
  10. compressionRaw, i, err := readUint16(bs, i) 
  11. if err != nil { 
  12.     return nil, 0, err 
  13. if compressionRaw == 8 { 
  14.     compression = deflateCompression 
  15.  
  16. lmTime, i, err := readUint16(bs, i) 
  17. if err != nil { 
  18.     return nil, 0, err 
  19.  
  20. lmDate, i, err := readUint16(bs, i) 
  21. if err != nil { 
  22.     return nil, 0, err 
  23. lastModified := msdosTimeToGoTime(lmDate, lmTime) 
  24.  
  25. crc32, i, err := readUint32(bs, i) 
  26. if err != nil { 
  27.     return nil, 0, err 
  28.  
  29. compressedSize, i, err := readUint32(bs, i) 
  30. if err != nil { 
  31.     return nil, 0, err 
  32.  
  33. uncompressedSize, i, err := readUint32(bs, i) 
  34. if err != nil { 
  35.     return nil, 0, err 
  36.  
  37. fileNameLength, i, err := readUint16(bs, i) 
  38. if err != nil { 
  39.     return nil, 0, err 
  40.  
  41. extraFieldLength, i, err := readUint16(bs, i) 
  42. if err != nil { 
  43.     return nil, 0, err 
  44.  
  45. fileName, i, err := readString(bs, i, int(fileNameLength)) 
  46. if err != nil { 
  47.     return nil, 0, err 
  48.  
  49. extraField, i, err := readBytes(bs, i, int(extraFieldLength)) 
  50. if err != nil { 
  51.     return nil, 0, err 

現在,如果文件內容未壓縮,我們只需復制文件頭后的字節即可。如果文件內容被壓縮,我們將使用 Go 的內置 DEFLATE 支持來解壓縮文件頭之后的字節。

  1. var fileContents string 
  2. if compression == noCompression { 
  3.     fileContents, i, err = readString(bs, i, int(uncompressedSize)) 
  4.     if err != nil { 
  5.         return nil, 0, err 
  6.     } 
  7. else { 
  8.     end := i + int(compressedSize) 
  9.     if end > len(bs) { 
  10.         return nil, 0, errOverranBuffer 
  11.     } 
  12.     flateReader := flate.NewReader(bytes.NewReader(bs[i:end])) 
  13.  
  14.     defer flateReader.Close() 
  15.     read, err := ioutil.ReadAll(flateReader) 
  16.     if err != nil { 
  17.         return nil, 0, err 
  18.     } 
  19.  
  20.     fileContents = string(read
  21.  
  22.     i = end 

并返回填充好的結構體實例:

  1. return &localFileHeader{ 
  2.     signature: signature, 
  3.     version: version, 
  4.     bitFlag: bitFlag, 
  5.     compression: compression, 
  6.     lastModified: lastModified, 
  7.     crc32: crc32, 
  8.     compressedSize: compressedSize, 
  9.     uncompressedSize: uncompressedSize, 
  10.     fileName: fileName, 
  11.     extraField: extraField, 
  12.     fileContents: fileContents, 
  13. }, i, nil 

04 讀取輔助函數

現在我們只定義那些帶有邊界檢查的讀取輔助函數,使用 Go 的內置庫來處理二進制編碼。

  1. var errOverranBuffer = fmt.Errorf("Overran buffer"
  2.  
  3. func readUint32(bs []byte, offset int) (uint32, int, error) { 
  4.     end := offset + 4 
  5.     if end > len(bs) { 
  6.         return 0, 0, errOverranBuffer 
  7.     } 
  8.  
  9.     return binary.LittleEndian.Uint32(bs[offset:end]), end, nil 
  10.  
  11. func readUint16(bs []byte, offset int) (uint16, int, error) { 
  12.     end := offset+2 
  13.     if end > len(bs) { 
  14.         return 0, 0, errOverranBuffer 
  15.     } 
  16.  
  17.     return binary.LittleEndian.Uint16(bs[offset:end]), end, nil 

并且基本上只對獲取的字節和字符串進行邊界檢查。

  1. func readBytes(bs []byte, offset int, n int) ([]byte, int, error) { 
  2.     end := offset + n 
  3.     if end > len(bs) { 
  4.         return nil, 0, errOverranBuffer 
  5.     } 
  6.  
  7.     return bs[offset:offset+n], end, nil 
  8.  
  9. func readString(bs []byte, offset int, n int) (string, int, error) { 
  10.     readend, err := readBytes(bs, offset, n) 
  11.     return string(read), end, err 

05 MSDOS 時間

我猜在創建 zip 時,MSDOS 時間格式很流行。但它在今天并不流行,所以花了一些時間才最終用一些代碼(模仿 C 語言)找到對該格式的解釋[2]。

  1. func msdosTimeToGoTime(d uint16, t uint16) time.Time { 
  2.     seconds := int((t & 0x1F) * 2) 
  3.     minutes := int((t >> 5) & 0x3F) 
  4.     hours := int(t >> 11) 
  5.  
  6.     day := int(d & 0x1F) 
  7.     month := time.Month((d >> 5) & 0x0F) 
  8.     year := int((d >> 9) & 0x7F) + 1980 
  9.     return time.Date(yearmonthday, hours, minutes, seconds, 0, time.Local

06 測試

運行:

  1. $ go build 
  2. $ ./gozip test.zip 
  3. 2021-11-23 23:04:20 +0000 UTC hello.text Hello! 

這看起來不錯!現在讓我們嘗試壓縮多個文件。

  1. $ cat bye.text 
  2. Au revoir! 
  3. $ rm test.zip 
  4. $ zip test.zip *.text 
  5.   adding: bye.text (stored 0%) 
  6.   adding: hello.text (stored 0%) 
  7. $ ./gozip test.zip 
  8. 2021-11-24 03:40:00 +0000 UTC bye.text Au revoir! 
  9.  
  10. 2021-11-23 23:04:20 +0000 UTC hello.text Hello! 

一切正常。

07 總結

實際上,還有許多標準需要處理(例如目錄)和許多常見的擴展,本文沒有涉及。

文件末尾還有一些空間,這可能是 “central directory” 元數據,但我還沒有深入研究。如果你有興趣可以查閱相關資料了解最后剩下的部分內容。

原文鏈接:https://notes.eatonphil.com/implementing-zip-in-go-unzipping.html

參考資料

[1]這里: https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT

[2]對該格式的解釋: https://groups.google.com/g/comp.os.msdos.programmer/c/ffAVUFN2NbA

 

責任編輯:武曉燕 來源: 幽鬼
相關推薦

2021-05-08 00:00:27

JavaScript ZIP文件

2019-10-17 17:15:01

Linux解壓文件命令

2015-04-08 15:40:53

php在線解壓解壓zip文件

2018-02-28 13:20:40

Python解壓zip

2023-04-02 23:13:07

Go語言bufio

2011-08-15 14:07:53

Objective-C解壓縮ZIP文件

2021-08-13 12:05:15

Goneturl

2023-03-29 08:59:59

Go壓縮包文檔

2024-02-22 12:16:55

Python壓縮數據

2020-09-09 14:30:24

2024-09-29 16:04:14

2012-05-10 09:43:28

2023-09-27 08:26:48

Go標準庫函數

2020-12-13 17:57:16

加密密碼Python

2021-08-10 21:58:54

Go語言Flag庫

2023-10-11 08:45:55

Go標準庫指標

2025-10-31 09:01:37

2011-12-30 11:14:41

Javazip

2020-12-21 16:00:07

Pythonzip文件密碼

2021-10-18 10:53:26

Go 代碼技術
點贊
收藏

51CTO技術棧公眾號

国产夫妻在线观看| 久久久久国产精品无码免费看| 韩国中文字幕2020精品| 蜜臀av在线播放一区二区三区| 国产亚洲精品一区二555| 狠狠躁狠狠躁视频专区| av在线看片| av亚洲精华国产精华精华| 人体精品一二三区| 美女视频久久久| 亚洲日本在线观看视频| 最新热久久免费视频| 国产日韩一区欧美| 在线播放成人av| 欧美国产三区| 亚洲欧美一区二区三区在线| 中文字幕资源在线观看| xxxx视频在线| 国产精品欧美一区喷水| 成人欧美一区二区三区视频| 天堂网中文字幕| 国产精品毛片久久| 精品视频久久久| 亚洲一级免费观看| 55av亚洲| 中文字幕一区三区| 亚洲xxxxx性| www.国产毛片| 亚洲高清在线| 日韩在线视频国产| 中文字幕无码人妻少妇免费| 素人一区二区三区| 亚洲一区二区三区美女| 亚洲人一区二区| 神宫寺奈绪一区二区三区| 蜜桃久久精品一区二区| 欧美有码在线观看视频| 久久r这里只有精品| 欧美日韩国产在线观看网站| 日韩精品一区二区三区三区免费 | 亚洲私人影院| 在线视频一区二区| 日本三级日本三级日本三级极| 精品美女一区| 色噜噜久久综合| 很污的网站在线观看| 日本在线视频观看| 国产欧美精品区一区二区三区 | 视频在线观看免费影院欧美meiju| 91激情在线视频| 337p粉嫩大胆噜噜噜鲁| 久草在线视频资源| 亚洲人成网站色在线观看| 日韩福利在线| 国内三级在线观看| 99精品一区二区三区| 91麻豆精品秘密入口| 亚洲中文字幕一区二区| 日本欧美久久久久免费播放网| 91av视频在线播放| 日本中文字幕在线免费观看| 999久久久国产精品| 亚洲欧美日韩一区在线| 欧美大奶子在线| 国产精品久久无码| 中文字幕久久精品一区二区| 欧美一区二区性放荡片| 国产成人美女视频| 羞羞视频在线观看一区二区| 欧美唯美清纯偷拍| 91日韩视频在线观看| 欧美日韩美女| 欧美日韩视频在线第一区| 天天影视综合色| 日韩高清在线| 色综合久久久久综合99| 可以免费观看av毛片| 小黄鸭精品aⅴ导航网站入口| 欧美视频裸体精品| 成人在线免费播放视频| 四虎成人在线| 666欧美在线视频| 亚洲综合123| 北条麻妃一区二区三区在线观看| 亚洲精品一线二线三线 | 视频一区视频二区中文字幕| 国产极品jizzhd欧美| 久久这里只有精品9| 久久国产生活片100| 91精品在线播放| 午夜精品久久久久久久第一页按摩| 国产精品亚洲成人| 精品国产免费久久久久久尖叫| 性感美女一级片| 欧美激情一区二区三区四区| 日韩视频在线免费播放| 免费在线毛片网站| 国产精品国产精品国产专区不片| 一区二区三区四区免费观看| 国产一线二线在线观看| 欧美性xxxxxxxxx| 日韩高清第一页| 视频精品一区二区三区| 亚洲片av在线| 国产av 一区二区三区| 国产日韩精品视频一区二区三区 | 亚洲资源在线网| 黄色成人影院| 天天综合日日夜夜精品| 亚洲五月天综合| 日韩精品视频在线看| 亚洲精品xxxx| 亚洲综合图片一区| 伊人影院久久| 国产精品视频免费观看www| www.色呦呦| 久久精品夜色噜噜亚洲aⅴ| 日韩av一区二区三区在线| 超碰免费在线播放| 懂色av一区二区三区| 国产成人黄色网址| 亚州综合一区| 欧美大片va欧美在线播放| 黄色片视频免费| 高清免费成人av| 欧美一区二区视频在线| h片精品在线观看| 91福利视频网站| 女人扒开双腿让男人捅 | 国模一区二区| 亚洲国产精品系列| 欧美三级黄色大片| 奇米777欧美一区二区| 99视频在线播放| 免费黄网在线观看| 色一情一乱一乱一91av| 日韩女优在线视频| 亚洲国产精品综合久久久| 国产精品白嫩初高中害羞小美女| 性网爆门事件集合av| 中文久久乱码一区二区| 蜜臀av午夜一区二区三区| 超碰成人97| 超碰精品一区二区三区乱码| 嫩草影院一区二区三区| 91美女蜜桃在线| 成年人午夜免费视频| 国产一区二区av在线| 亚洲精选中文字幕| 欧美日韩三级在线观看| 久久99精品久久久久久国产越南| 日韩精品欧美一区二区三区| www在线观看黄色| 亚洲第一视频在线观看| 久久综合色综合| 国产在线国偷精品免费看| 亚洲欧洲国产精品久久| av成人免费| 国产一区二区三区高清在线观看| 国产一级淫片a| 风流少妇一区二区| 日韩欧美猛交xxxxx无码| 中文字幕一区二区三区四区久久 | 欧美激情黑人| 欧美日韩国产欧美日美国产精品| 国产熟女一区二区| 免费观看久久久4p| 先锋影音一区二区三区| 亚洲四虎影院| 日韩中文娱乐网| 国产精品乱码久久久| 亚洲欧美另类在线| 四虎国产精品免费| 99热免费精品| 欧美日韩精品中文字幕一区二区| 第84页国产精品| 伊人伊人伊人久久| 一级黄色免费片| 一区二区在线观看视频在线观看| 午夜福利三级理论电影| 亚洲制服少妇| 欧洲精品码一区二区三区免费看| 综合另类专区| 一区二区三欧美| 国产精品亚洲欧美在线播放| 一区二区三区日韩欧美精品| 国产视频久久久久久| 视频一区在线视频| 中文字幕在线中文字幕日亚韩一区| 国产精品1区| 日韩成人dvd| 国产精选久久久久久| 顶级网黄在线播放| 亚洲高清一区二| 成人免费毛片男人用品| 欧美韩日一区二区三区| 亚洲黄色a v| 欧美日韩一区二区国产| 欧美不卡福利| 电影中文字幕一区二区| 亚洲18私人小影院| av一本在线| 欧美变态tickling挠脚心| 精品人妻无码一区二区性色| 国产精品大尺度| 欧美视频国产视频| 欧美三区在线| 日本中文不卡| 一区二区三区欧洲区| 欧美在线视频一二三| 男人资源在线播放| 精品亚洲一区二区三区在线播放| 一二区在线观看| 亚洲国产va精品久久久不卡综合| 一级在线观看视频| 成人18精品视频| 亚洲欧美视频二区| 亚洲美女少妇无套啪啪呻吟| 亚洲一二区在线| 亚洲精品亚洲人成在线观看| 91在线网站视频| 日本久久免费| 国内精品久久久久伊人av| 韩国三级在线观看久| 精品福利一区二区三区| 96亚洲精品久久久蜜桃| 欧美午夜片在线免费观看 | 久久久国产精华| 又色又爽又黄18网站| 蜜桃视频一区二区| aa免费在线观看| 激情偷拍久久| 老司机午夜网站| 久久中文视频| 清纯唯美一区二区三区| 成人三级av在线| 1卡2卡3卡精品视频| japanese23hdxxxx日韩| 97久久超碰福利国产精品…| 顶级网黄在线播放| 北条麻妃99精品青青久久| 加勒比一区二区三区在线| 欧美精品一区二区三区高清aⅴ| 国产免费av观看| 欧美色图片你懂的| 日本成人一级片| 日本丶国产丶欧美色综合| 少妇太紧太爽又黄又硬又爽 | 天堂在线免费观看视频| 亚洲自拍欧美精品| 久久免费小视频| 亚洲综合一区二区三区| 国产精品久久国产精麻豆96堂| 97se亚洲国产综合自在线| 国产性猛交96| 成人中文字幕电影| 亚洲高清视频免费| 精品一区二区三区的国产在线播放| 中文字幕在线观看第三页| 三级欧美韩日大片在线看| 日韩中文字幕组| 蜜乳av另类精品一区二区| 国产av人人夜夜澡人人爽麻豆| 亚洲欧美一级二级三级| 成年丰满熟妇午夜免费视频| 午夜欧美精品| 久久国产午夜精品理论片最新版本| 国内精品福利| 日本在线xxx| 亚洲精选久久| 国产人妻777人伦精品hd| 国产日韩欧美在线播放不卡| 凹凸日日摸日日碰夜夜爽1| 日韩国产欧美三级| 国产无遮挡猛进猛出免费软件| 久久99久久99小草精品免视看| 四川一级毛毛片| 成人免费观看av| 亚洲精品乱码久久久久久久| 久久久久久久综合色一本| 国产精品久久免费观看| 中文字幕一区二区三区乱码在线 | 国产性做久久久久久| 一区二区三区在线观看免费视频| 中文字幕一区二区三区四区| 久久精品波多野结衣| 午夜欧美视频在线观看| 精品黑人一区二区三区| 欧美午夜视频网站| 精品国产九九九| 精品呦交小u女在线| 啊v在线视频| 欧美日韩国产成人| 无遮挡爽大片在线观看视频| 国产精品永久在线| 一区二区三区高清在线观看| 国产精品一区二区欧美黑人喷潮水| 任我爽精品视频在线播放| 亚洲二区自拍| 亚洲福利免费| 亚洲熟妇av一区二区三区| 久久爱www久久做| 成年女人免费视频| 国产欧美精品在线观看| 欧美三级在线免费观看| 亚洲欧美日韩在线不卡| 亚洲永久精品在线观看| 欧美日本一区二区三区四区| 四季av日韩精品一区| 在线观看国产精品91| 蜜桃成人365av| 国产精品私拍pans大尺度在线| 高清一区二区| 日韩激情视频| 国内久久视频| 超碰成人在线播放| 97se亚洲国产综合在线| 久久国产精品国语对白| 色偷偷成人一区二区三区91| 精品久久国产视频| 一区二区亚洲欧洲国产日韩| 国产www视频在线观看| 国产日韩欧美影视| 一道本一区二区三区| 999久久欧美人妻一区二区| 另类小说欧美激情| 免费看黄色aaaaaa 片| 亚洲女同女同女同女同女同69| 中文字幕在线观看视频免费| 亚洲精品一区二区三区蜜桃下载| 日本精品在线| 国产精品第3页| 欧美aaaaaaaa牛牛影院| 国产精品视频一二三四区| 久久高清免费| www.四虎成人| 国产视频一区不卡| 欧美人一级淫片a免费播放| 亚洲毛茸茸少妇高潮呻吟| 中文字幕在线官网| 免费国产一区| 日韩精品乱码av一区二区| 欧美日韩高清丝袜| 欧美性猛交xxxx乱大交退制版| av在线二区| 国产精品视频一区二区三区四 | 成人午夜视频在线播放| 日韩电影免费观看中文字幕| 欧美伦理91| 日本一区视频在线| 日韩av网站免费在线| 一级片久久久久| 欧美日韩五月天| av中文字幕在线观看| 成人在线看片| 一区二区三区成人精品| 扒开jk护士狂揉免费| 欧美午夜影院一区| 成视频免费观看在线看| 国产精品区一区二区三在线播放 | 亚洲一二三级电影| 欧美少妇bbw| 国产91ⅴ在线精品免费观看| 国产精品日韩精品中文字幕| 亚洲久久中文字幕| 亚洲老妇xxxxxx| 色欲av伊人久久大香线蕉影院| 茄子视频成人在线| 久久综合成人| 免费黄色在线播放| 欧美视频在线观看免费| 成人免费在线电影| 99热国产免费| 视频一区欧美精品| 2021亚洲天堂| 国产午夜精品麻豆| 亚洲成a人片777777久久| 人妻互换免费中文字幕| 337p粉嫩大胆色噜噜噜噜亚洲| 亚洲国产无线乱码在线观看| 欧美美女18p| 久久最新网址| 精品国产午夜福利在线观看| 第一福利永久视频精品| 国产一二三区在线观看| 久久99导航| 久久成人av少妇免费| 在线观看精品国产| 神马久久桃色视频| 欧美人妖在线观看| 三年中文在线观看免费大全中国| 亚洲第一久久影院| 久草资源在线| 久久综合狠狠综合久久综青草| 国产一区二区成人久久免费影院| 一级片中文字幕| 欧美插天视频在线播放| 国产精品嫩草影院在线看| 成人啪啪18免费游戏链接| 欧美三级电影精品|