青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-3  評論-5  文章-13  trackbacks-0
TKYQuickPack(快速壓縮類), TKYQuickUnpack(快速解壓縮類), 源碼如下:

KYQuickPack.h 文件

 1 // =======================================
 2 // Unit   : 快速壓縮/解壓縮單元 (KYQuickPack.h)
 3 // Version: 3.0.0.0 (build 2011.03.18)
 4 // Author : Kyee Ye
 5 // Email  : kyee_ye(at)126.com
 6 // Copyright (C) Kyee workroom
 7 // =======================================
 8 
 9 #ifndef _KYQuickPack_H_
10 #define _KYQuickPack_H_
11 
12 #include "KYPackObj.h"
13 
14 // KYLib 2.0 開始使用 KYLib 命名空間
15 namespace KYLib
16 {
17 
18 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
19 
20 /* TKYQuickPack - 快速壓縮類(基于LZRW壓縮算法) */
21 
22 class TKYQuickPack: public TKYCustomPack
23 {
24 public:
25    TKYQuickPack();
26    virtual ~TKYQuickPack();
27 
28    // 屬性
29    bool           IsPacking() const    { return FIsPacking; }  // default: false
30 
31    // 重置
32    virtual void   Reset();
33 
34    // 壓縮緩沖區
35    // 1. ABuffer 存放 ASize 字節的待壓縮數據
36    // 2. ADest   存放壓縮后的數據, 緩沖區尺寸至少為 ASize
37    // 3. 若返回值 > 0 表示壓縮后數據的尺寸
38    // 4. 若返回值為 0 表示壓縮失敗, 即待壓縮數據無法再壓縮
39    // 5. 若返回值為 -1 表示參數不合法
40    // 6. 若返回值為 -2 表示壓縮失敗, 原因是正在壓縮
41    virtual long   Pack(const char* ABuffer, char* ADest, long ASize);
42 
43 private:
44    void           DoCopy(const char* ABuffer, long ASize);
45    bool           DoMatch(Byte* APos, Byte* AEnd, Word& AOffset, Byte& ADepth);
46 
47 private:
48    Word           FHash[4096];         // 哈希表
49    char           FContext[4096];      // 壓縮數據的上下文
50    Longword       FLastSize;           // 上一次 pack 結束后的尺寸
51    bool           FIsPacking;          // 判斷是否正在壓縮
52    bool           FIsOverflow;         // 判斷上下文列表是否溢出
53 };
54 
55 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
56 
57 /* TKYQuickUnpack - 快速解壓縮類(基于LZRW壓縮算法) */
58 
59 class TKYQuickUnpack: public TKYCustomUnpack
60 {
61 public:
62    TKYQuickUnpack();
63    virtual ~TKYQuickUnpack();
64 
65    // 屬性
66    bool           IsUnpacking() const  { return FIsUnpacking; }// default: false
67 
68    // 重置
69    virtual void   Reset();
70 
71    // 解壓縮緩沖區
72    // 1. 若 AIsPacked 為 false 表示數據未壓縮, 即為解壓縮的上下文相關性而操作,
73    //    但不會拷貝數據到 ADest, 并返回值為 0
74    // 2. ABuffer 存放 ASize 字節的已壓縮數據
75    // 3. ADest   存放解壓縮后的數據, ADestSize >= ASize
76    // 4. 若返回值 > 0 表示解壓縮后數據的尺寸
77    // 5. 若返回值為 0 表示解壓縮失敗, 可能 ADestSize 太小或數據未壓縮
78    // 6. 若返回值為 -1 表示參數不合法
79    // 7. 若返回值為 -2 表示解壓縮失敗, 原因是數據已損壞
80    // 8. 若返回值為 -3 表示解壓縮失敗, 原因是正在解壓縮
81    virtual long   Unpack(const char* ABuffer, long ASize,
82                                char* ADest,   long ADestSize,
83                                bool  AIsPacked = true);
84 
85 private:
86    void           DoCopy(const char* ABuffer, long ASize);
87    bool           DoInsert(char* &APos, Word AOffset, Byte ADepth);
88 
89 private:
90    char           FContext[4096];      // 已解壓的上下文
91    Longword       FLastSize;           // 上一次 unpack 結束后的尺寸
92    bool           FIsOverflow;         // 判斷上下文列表是否溢出
93    bool           FIsUnpacking;        // 判斷是否正在解壓縮
94 };
95 
96 }
97 
98 #endif
99 

 


KYQuickPack.cpp 文件:

  1 // =======================================
  2 // Unit   : 快速壓縮/解壓縮單元 (KYQuickPack.cpp)
  3 // Version: 3.0.0.0 (build 2011.03.18)
  4 // Author : Kyee Ye
  5 // Email  : kyee_ye(at)126.com
  6 // Copyright (C) Kyee workroom
  7 // =======================================
  8 
  9 #include "KYQuickPack.h"
 10 
 11 // KYLib 2.0 開始使用 KYLib 命名空間
 12 namespace KYLib
 13 {
 14 
 15 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 16 
 17 /* 常量定義 */
 18 
 19 // 常量
 20 #define Max_Depth              18      // 最大匹配深度
 21 #define Max_Offset           4096      // 最大偏移量
 22 #define Mask_Index         0x7FFF      // 索引的掩碼
 23 #define Mask_Hash          0x0FFF      // 哈希的掩碼
 24 #define Hash_RandomGene     45673      // 哈希的隨機因子必須是素數,
 25                                        // 且除以 4096 的商和余數也是素數
 26 
 27 // 布爾位值
 28 static const Byte Bits_Bool[8]   = {0x800x400x200x10,
 29                                     0x080x040x020x01};
 30 
 31 // 取 Word 的高 8 位字節
 32 static inline Byte HiByte(Word AValue)
 33 {
 34    return (Byte)(AValue >> 8);
 35 }
 36 
 37 // 取 Word 的低 8 位字節
 38 static inline Byte LoByte(Word AValue)
 39 {
 40    return (Byte)AValue;
 41 }
 42 
 43 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 44 
 45 /* TKYQuickPack - 快速壓縮類(基于LZRW壓縮算法) */
 46 
 47 // ---------------- 構造函數和析構函數 ----------------
 48 // 構造函數
 49 TKYQuickPack::TKYQuickPack()
 50 {
 51    // 清空
 52    FIsPacking  = false;
 53    Reset();
 54 }
 55 
 56 // 析構函數
 57 TKYQuickPack::~TKYQuickPack()
 58 {
 59 }
 60 
 61 // ---------------- 私有函數 ----------------
 62 // 拷貝上下文
 63 void TKYQuickPack::DoCopy(const char* ABuffer, long ASize)
 64 {
 65    // 初始化
 66    long  intSize;
 67    char* pDest = (char*)FContext;
 68    char* pPos  = (char*)ABuffer;
 69    char* pEnd  = pPos + ASize;
 70 
 71    // 檢查尺寸
 72    if (ASize >= Max_Offset)
 73       memcpy(pDest, pEnd - Max_Offset, Max_Offset);
 74    else if ((FLastSize >= Max_Offset) || FIsOverflow)
 75    {
 76       intSize  = Max_Offset - ASize;
 77       memmove(pDest, pDest + ASize, intSize);
 78       memcpy(pDest + intSize, pPos, ASize);
 79    }
 80    else if (FLastSize + ASize > Max_Offset)
 81    {
 82       intSize  = Max_Offset - ASize;
 83       memmove(pDest, pDest + (FLastSize - intSize), intSize);
 84       memcpy(pDest + intSize, pPos, ASize);
 85    }
 86    else
 87       memcpy(pDest + FLastSize, pPos, ASize);
 88 
 89    // 修改最后尺寸
 90    FSize       = FLastSize + ASize;
 91    FIsOverflow = FIsOverflow || (FSize < FLastSize);
 92    FLastSize   = FSize;
 93 }
 94 
 95 // 索引項匹配
 96 bool TKYQuickPack::DoMatch(Byte* APos, Byte* AEnd, Word& AOffset, Byte& ADepth)
 97 {
 98    // 初始化
 99    bool result = false;
100    Word wIndex, wHash, wValue;
101 
102    // 計算 Hash 值
103    wHash       = ((Word)APos[0<< 8^ ((Word)APos[1<< 4^ (Word)APos[2];
104    wHash       = ((wHash * Hash_RandomGene) >> 4& Mask_Hash;
105    wValue      = FHash[wHash];
106    wIndex      = (Word)FSize & Mask_Index;
107    AOffset     = (wIndex - wValue) & Mask_Index;
108    FHash[wHash]= wIndex;
109 
110    // 判斷偏移量是否有效
111    if ((wValue <= Mask_Index) && (AOffset < Max_Offset) && (AOffset != 0))
112    {
113       // 初始化
114       Word wDepth = (Word)Min(AEnd - APos, Max_Depth);
115       Byte* pPos  = APos;
116       Byte* pEnd  = APos + wDepth;
117       Byte* pDest;
118 
119       // 檢查是否超出上下文
120       if (FSize - FLastSize >= AOffset)
121       {
122          pDest = APos - AOffset;
123          while ((pPos < pEnd) && (*pPos == *pDest))
124          {
125             pPos++;
126             pDest++;
127          }
128       }
129       else
130       {
131          // 初始化
132          Word wSize  = (Word)(FSize - FLastSize);  // (FSize - FLastSize < AOffset)
133          Word wFront = AOffset - wSize;
134 
135          // 計算起始位置
136          pDest = (Byte*)FContext;
137          if ((FLastSize >= Max_Offset) || FIsOverflow)
138             pDest += Max_Offset - wFront;
139          else
140             pDest += FLastSize - wFront;
141 
142          // 判斷是否分二部分比較
143          if (wFront < wDepth)
144          {
145             // 初始化
146             Byte* pDestEnd = pDest + wFront;
147 
148             // 前半部分比較
149             while ((pDest < pDestEnd) && (*pPos == *pDest))
150             {
151                pPos++;
152                pDest++;
153             }
154 
155             // 判斷是否需要繼續匹配
156             if (pDest == pDestEnd)
157             {
158                pDest = APos - wSize;
159                while ((pPos < pEnd) && (*pPos == *pDest))
160                {
161                   pPos++;
162                   pDest++;
163                }
164             }
165          }
166          else
167             while ((pPos < pEnd) && (*pPos == *pDest))
168             {
169                pPos++;
170                pDest++;
171             }
172       }
173 
174       // 檢查匹配長度
175       ADepth = (Byte)(pPos - APos);
176       result = (ADepth >= 3);
177    }
178 
179    // 返回結果
180    return result;
181 }
182 
183 // ---------------- 保護函數 ----------------
184 
185 // ---------------- 公有函數 ----------------
186 // 重置
187 void TKYQuickPack::Reset()
188 {
189    if (!FIsPacking)
190    {
191       // 置空
192       FSize          = 0;
193       FLastSize      = 0;
194       FIsOverflow    = false;
195 
196       // 初始化哈希表
197       memset(FHash, -1sizeof(FHash));
198    }
199 }
200 
201 // 壓縮緩沖區
202 // 1. ABuffer 存放 ASize 字節的待壓縮數據
203 // 2. ADest   存放壓縮后的數據, 緩沖區尺寸至少為 ASize
204 // 3. 若返回值 > 0 表示壓縮后數據的尺寸
205 // 4. 若返回值為 0 表示壓縮失敗, 即待壓縮數據無法再壓縮
206 // 5. 若返回值為 -1 表示參數不合法
207 // 6. 若返回值為 -2 表示壓縮失敗, 原因是正在壓縮
208 long TKYQuickPack::Pack(const char* ABuffer, char* ADest, long ASize)
209 {
210    // 檢查是否正在壓縮
211    if (FIsPacking)
212       return -2;
213 
214    // 置壓縮狀態
215    FIsPacking = true;
216 
217    // 初始化
218    long result = 0;
219 
220    // 檢查參數
221    if ((ASize <= 0|| (ABuffer == NULL) || (ADest == NULL))
222       result = -1;
223    else
224    {
225       try
226       {
227          // 初始化
228          Word  wSize, wOffset;
229          Byte* pSame;
230          Byte* pLast;
231          Byte* pPos     = (Byte*)ABuffer;
232          Byte* pEnd     = pPos + ASize - 2;
233          Byte* pBuffEnd = pPos + ASize;
234          Byte* pFlag    = (Byte*)ADest;
235          Byte* pDest    = pFlag + 1;
236          Byte* pDestEnd = pFlag + ASize;
237          Byte  byteDepth= 0;
238          Byte  byteFlag = 0;
239          Byte  byteBit  = 0;
240          bool  boolOver = false;
241 
242          // 循環匹配
243          while (pPos < pBuffEnd)
244          {
245             // 檢查標志位是否已滿
246             if (byteBit == 8)
247             {
248                *pFlag   = byteFlag;
249                pFlag    = pDest++;
250                byteBit  = 0;
251                byteFlag = 0;
252             }
253 
254             // 檢查是否相同數據
255             pLast = Min(pBuffEnd, pPos + Max_Offset + 8);
256             pSame = pPos + 1;
257             while ((pSame < pLast) && (*pSame == *pPos))
258                pSame++;
259 
260             // 檢查相同數據尺寸是否大于等于 8
261             wSize = pSame - pPos - 1;
262             if (wSize >= 8)
263             {
264                if (pDest < pDestEnd - 4)
265                {
266                   wSize      -= 8;
267                   *(pDest++)  = 0;
268                   *(pDest++)  = HiByte(wSize);
269                   *(pDest++)  = LoByte(wSize);
270                   *(pDest++)  = *pPos;
271                   byteFlag   |= Bits_Bool[byteBit];
272                   FSize      += wSize + 9;
273                   pPos        = pSame;
274                }
275                else
276                {
277                   boolOver = true;
278                   break;
279                }
280             }
281             else if ((pPos < pEnd) && DoMatch(pPos, pBuffEnd, wOffset, byteDepth))
282             {
283                if (pDest < pDestEnd - 2)
284                {
285                   wOffset     = (wOffset << 4+ (byteDepth - 3);
286                   *(pDest++)  = HiByte(wOffset);
287                   *(pDest++)  = LoByte(wOffset);
288                   byteFlag   |= Bits_Bool[byteBit];
289                   FSize      += byteDepth;
290                   pPos       += byteDepth;
291                }
292                else
293                {
294                   boolOver = true;
295                   break;
296                }
297             }
298             else if (pDest < pDestEnd)
299             {
300                *(pDest++)  = *(pPos++);
301                FSize++;
302             }
303             else
304             {
305                boolOver = true;
306                break;
307             }
308 
309             // 位數加 1
310             byteBit++;
311          }
312 
313          // 檢查是否溢出
314          if (!boolOver && (pDest < pDestEnd))
315          {
316             *pFlag   = byteFlag;
317             result   = pDest - (Byte*)ADest;
318          }
319       }
320       catch () {}
321 
322       // 拷貝上下文
323       DoCopy(ABuffer, ASize);
324    }
325 
326    // 返回結果
327    FIsPacking = false;
328    return result;
329 }
330 
331 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
332 
333 /* TKYQuickUnpack - 快速解壓縮類(基于LZRW壓縮算法) */
334 
335 // ---------------- 構造函數和析構函數 ----------------
336 // 構造函數
337 TKYQuickUnpack::TKYQuickUnpack()
338 {
339    // 初始化
340    FSize          = 0;
341    FLastSize      = 0;
342    FIsOverflow    = false;
343    FIsUnpacking   = false;
344 }
345 
346 // 析構函數
347 TKYQuickUnpack::~TKYQuickUnpack()
348 {
349 }
350 
351 // ---------------- 私有函數 ----------------
352 // 拷貝上下文
353 void TKYQuickUnpack::DoCopy(const char* ABuffer, long ASize)
354 {
355    // 初始化
356    long  intSize;
357    char* pDest = (char*)FContext;
358    char* pPos  = (char*)ABuffer;
359    char* pEnd  = pPos + ASize;
360 
361    // 檢查尺寸
362    if (ASize >= Max_Offset)
363       memcpy(pDest, pEnd - Max_Offset, Max_Offset);
364    else if ((FLastSize >= Max_Offset) || FIsOverflow)
365    {
366       intSize  = Max_Offset - ASize;
367       memmove(pDest, pDest + ASize, intSize);
368       memcpy(pDest + intSize, pPos, ASize);
369    }
370    else if (FLastSize + ASize > Max_Offset)
371    {
372       intSize  = Max_Offset - ASize;
373       memmove(pDest, pDest + (FLastSize - intSize), intSize);
374       memcpy(pDest + intSize, pPos, ASize);
375    }
376    else
377       memcpy(pDest + FLastSize, pPos, ASize);
378 
379    // 修改最后尺寸
380    FSize       = FLastSize + ASize;
381    FIsOverflow = FIsOverflow || (FSize < FLastSize);
382    FLastSize   = FSize;
383 }
384 
385 // 插入指定偏移量的數據
386 bool TKYQuickUnpack::DoInsert(char* &APos, Word AOffset, Byte ADepth)
387 {
388    // 初始化
389    bool  result = true;
390    char* pEnd   = APos + ADepth;
391    char* pDest;
392 
393    // 檢查是否屬于當前數據段
394    if (FSize - FLastSize >= AOffset)
395    {
396       pDest = APos - AOffset;
397       for (; APos < pEnd; APos++, pDest++)
398          *APos = *pDest;
399    }
400    else
401    {
402       // 初始化
403       Word wSize  = (Word)(FSize - FLastSize);
404       Word wFront = AOffset - wSize;
405 
406       // 計算起始位置
407       pDest = FContext;
408       if ((FLastSize >= Max_Offset) || FIsOverflow)
409          pDest += Max_Offset - wFront;
410       else if (wFront <= FLastSize)
411          pDest += FLastSize - wFront;
412       else
413          result = false;
414 
415       // 判斷偏移量是否合法
416       if (result)
417       {
418          // 判斷是否分二部分拷貝
419          if (wFront < ADepth)
420          {
421             // 初始化
422             char* pDestEnd = pDest + wFront;
423             char* pBegin   = APos - wSize;
424 
425             // 拷貝前半部
426             for (; pDest < pDestEnd; APos++, pDest++)
427                *APos = *pDest;
428 
429             // 后半部的開始
430             pDest = pBegin;
431          }
432 
433          // 拷貝后半部
434          for (; APos < pEnd; APos++, pDest++)
435             *APos = *pDest;
436       }
437    }
438 
439    // 返回結果
440    return result;
441 }
442 
443 // ---------------- 保護函數 ----------------
444 
445 // ---------------- 公有函數 ----------------
446 // 重置
447 void TKYQuickUnpack::Reset()
448 {
449    if (!FIsUnpacking)
450    {
451       FSize       = 0;
452       FLastSize   = 0;
453       FIsOverflow = false;
454    }
455 }
456 
457 // 解壓縮緩沖區
458 // 1. 若 AIsPacked 為 false 表示數據未壓縮, 即為解壓縮的上下文相關性而操作,
459 //    但不會拷貝數據到 ADest, 并返回值為 0
460 // 2. ABuffer 存放 ASize 字節的已壓縮數據
461 // 3. ADest   存放解壓縮后的數據, ADestSize >= ASize
462 // 4. 若返回值 > 0 表示解壓縮后數據的尺寸
463 // 5. 若返回值為 0 表示解壓縮失敗, 可能 ADestSize 太小或數據未壓縮
464 // 6. 若返回值為 -1 表示參數不合法
465 // 7. 若返回值為 -2 表示解壓縮失敗, 原因是數據已損壞
466 // 8. 若返回值為 -3 表示解壓縮失敗, 原因是正在解壓縮
467 long TKYQuickUnpack::Unpack(const char* ABuffer, long ASize,
468                                   char* ADest,   long ADestSize, bool AIsPacked)
469 {
470    // 檢查是否正在壓縮
471    if (FIsUnpacking)
472       return -3;
473 
474    // 置壓縮狀態
475    FIsUnpacking = true;
476 
477    // 初始化
478    long result = -1;
479 
480    // 檢查參數
481    if ((ABuffer == NULL) || (ASize <= 0))
482       ;
483    else if (!AIsPacked)
484    {
485       DoCopy(ABuffer, ASize);
486       result = 0;
487    }
488    else if ((ADestSize >= ASize) && (ADest != NULL))
489    {
490       // 初始化
491       result = -2;
492 
493       // 操作
494       try
495       {
496          // 初始化
497          char  charSame;
498          Byte  byteFlag, byteDepth;
499          Word  wSize, wOffset;
500          char* pLast;
501          char* pDest       = ADest;
502          char* pDestEnd    = ADest + ADestSize;
503          Byte* pPos        = (Byte*)ABuffer;
504          Byte* pEnd        = pPos + ASize - 2;
505          Byte* pBuffEnd    = pPos + ASize;
506          Byte  byteBit     = 8;
507          bool  boolOver    = false;
508          bool  boolError   = false;
509 
510          // 循環匹配
511          while (pPos < pBuffEnd)
512          {
513             // 檢查標志位是否已滿
514             if (byteBit == 8)
515             {
516                byteFlag = *pPos;
517                byteBit  = 0;
518 
519                // 檢查是否錯誤
520                if (++pPos >= pBuffEnd)
521                {
522                   boolError = true;
523                   break;
524                }
525             }
526 
527             // 判斷是否壓縮
528             if ((byteFlag & Bits_Bool[byteBit]) != 0)
529             {
530                if (pPos <= pEnd)
531                {
532                   // 取偏移量
533                   wOffset  = ((Word)pPos[0<< 4+ (pPos[1>> 4);
534                   pPos++;
535 
536                   // 判斷是否為匹配串
537                   if (wOffset != 0)
538                   {
539                      byteDepth = (*(pPos++& 0x0F+ 3;
540                      if (pDest + byteDepth > pDestEnd)
541                      {
542                         boolOver = true;
543                         break;
544                      }
545                      else if (DoInsert(pDest, wOffset, byteDepth))
546                         FSize += byteDepth;
547                      else
548                      {
549                         boolError = true;
550                         break;
551                      }
552                   }
553                   else if (pPos < pEnd)
554                   {
555                      // 取相同尺寸及字符
556                      wSize    = ((Word)pPos[0<< 8+ pPos[1+ 9;
557                      pLast    = pDest + wSize;
558                      charSame = (char)pPos[2];
559                      pPos    += 3;
560 
561                      // 檢查是否溢出
562                      if (pLast > pDestEnd)
563                      {
564                         boolOver = true;
565                         break;
566                      }
567                      else
568                      {
569                         FSize += wSize;
570                         for (; pDest < pLast; pDest++)
571                            *pDest = charSame;
572                      }
573                   }
574                   else
575                   {
576                      boolError = true;
577                      break;
578                   }
579                }
580                else
581                {
582                   boolError = true;
583                   break;
584                }
585             }
586             else if (pDest < pDestEnd)
587             {
588                *(pDest++= (char)*(pPos++);
589                FSize++;
590             }
591             else
592             {
593                boolOver = true;
594                break;
595             }
596 
597             // 位數加 1
598             byteBit++;
599          }
600 
601          // 判斷是否溢出
602          if (boolOver)
603             result = 0;
604          else if (!boolError)
605             result = pDest - ADest;
606       }
607       catch () {}
608 
609       // 判斷是否成功
610       if (result > 0)
611          DoCopy(ADest, result);
612       else
613          FSize = FLastSize;
614    }
615 
616    // 返回結果
617    FIsUnpacking = false;
618    return result;
619 }
620 
621 }
622 

 

posted on 2011-05-22 12:24 Kyee Ye 閱讀(1098) 評論(0)  編輯 收藏 引用 所屬分類: C++類庫KYLib 源碼
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            猫咪成人在线观看| 夜夜嗨av一区二区三区| 先锋影院在线亚洲| 国产欧美日韩一区二区三区在线观看| 欧美一级视频| 亚洲欧美日韩在线观看a三区| 日韩亚洲不卡在线| 亚洲一区图片| 久久一区二区三区国产精品| 日韩视频专区| 老鸭窝亚洲一区二区三区| 午夜一区不卡| 欧美国产日韩精品| 国产精品每日更新| 国产综合色精品一区二区三区| 国产啪精品视频| 最新成人在线| 欧美日韩理论| 校园激情久久| 久久国产精品一区二区三区四区| 亚洲欧美在线播放| 亚洲自拍都市欧美小说| 亚洲嫩草精品久久| 久久电影一区| 蜜桃精品一区二区三区| 欧美黑人一区二区三区| 国产精品白丝黑袜喷水久久久 | 亚洲欧美欧美一区二区三区| 亚洲一品av免费观看| 欧美资源在线观看| 欧美激情在线观看| 亚洲欧美成人一区二区三区| 欧美精品久久一区| 免费在线看成人av| 一区二区三区欧美激情| 久久亚洲综合色| 欧美日韩福利视频| 国内精品视频一区| 亚洲特黄一级片| 免费久久99精品国产| 中日韩男男gay无套| 久久视频精品在线| 国产精品婷婷| 一区二区三区视频在线播放| 久久亚洲一区二区三区四区| 99综合电影在线视频| 蜜桃视频一区| 狠狠操狠狠色综合网| 亚洲天堂av在线免费| 欧美黄色免费| 久久爱www.| 国产精品中文在线| 夜夜嗨av色一区二区不卡| 欧美成人精品高清在线播放| 亚洲欧美一区二区在线观看| 欧美日韩国产综合视频在线| 亚洲韩日在线| 蜜桃久久av| 久久精品夜夜夜夜久久| 国产一区二区三区免费不卡| 亚洲欧美成人在线| 99av国产精品欲麻豆| 毛片一区二区| 精品不卡一区二区三区| 久久久久久综合| 久久久久久久精| 国内精品美女在线观看| 久久国产精品99久久久久久老狼| 亚洲天堂av高清| 国产美女精品| 久久久久国产精品厨房| 久久精品久久99精品久久| 国产午夜精品理论片a级大结局| 亚洲午夜成aⅴ人片| 激情成人亚洲| 狠狠色综合网站久久久久久久| 欧美亚洲自偷自偷| 亚洲图片在线观看| 国产精品一二| 久久aⅴ国产欧美74aaa| 欧美一区二区三区免费大片| 国产婷婷色一区二区三区四区| 久久成年人视频| 久久久久久久久久久一区| 亚洲电影第三页| 亚洲第一狼人社区| 欧美精品播放| 性欧美精品高清| 久久岛国电影| 日韩一区二区福利| 日韩视频专区| 国产日产亚洲精品| 狂野欧美一区| 欧美高清一区二区| 午夜精品免费在线| 久久久久在线观看| 一区二区三区四区五区视频| 亚洲视频在线视频| 激情成人在线视频| 日韩视频一区二区在线观看| 国产精品网站在线观看| 久久精品国产成人| 欧美国产精品va在线观看| 午夜精品久久久久久久久久久久久| 亚洲欧美日韩国产一区| 亚洲国产激情| 亚洲欧美久久久| 亚洲高清久久久| 亚洲精品久久久久中文字幕欢迎你| 国产精品乱子乱xxxx| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲精品网站在线播放gif| 最新国产の精品合集bt伙计| 国产精品久久精品日日| 免费一级欧美片在线播放| 国产精品swag| 欧美激情中文字幕一区二区| 国产美女一区二区| 国产精品天天看| 欧美高清自拍一区| 国产精品影片在线观看| 亚洲高清在线观看| 国产一区二区三区在线观看网站 | 欧美aⅴ一区二区三区视频| 国产精品推荐精品| 亚洲国产高清自拍| 午夜精彩视频在线观看不卡| 久久夜色精品| 欧美一级黄色录像| 国产日产精品一区二区三区四区的观看方式 | 久久精品中文字幕免费mv| 亚洲九九九在线观看| 欧美mv日韩mv国产网站| 亚洲欧美影院| 亚洲影院高清在线| 欧美一区久久| 亚洲高清视频在线观看| 亚洲日本国产| 欧美一区二区精品在线| 欧美激情欧美狂野欧美精品 | 欧美日韩激情小视频| 久久久久久久综合| 久久久亚洲影院你懂的| 一区二区三区高清不卡| 亚洲一区二区成人| 一区二区日韩精品| 欧美xart系列高清| 老司机亚洲精品| 午夜亚洲福利在线老司机| 欧美国产日本在线| 老鸭窝亚洲一区二区三区| 国产精品一卡二卡| 亚洲国产日韩欧美在线动漫| 国产精品自拍视频| 国产精品啊啊啊| 亚洲一区二区三区涩| 亚洲精品视频在线看| 国产精品第13页| 亚洲视频你懂的| 久久综合影视| 久久九九精品| 一区二区三区精品| 欧美成人影音| 国产精品网站一区| 欧美激情精品久久久久久黑人| 欧美精选一区| 最新亚洲电影| 中文有码久久| 国产精品一区二区久激情瑜伽| 欧美1区3d| 亚洲欧美在线观看| 1024精品一区二区三区| 欧美在线一二三| 久久成人这里只有精品| 欧美精品自拍| 亚洲一区二区在线播放| 欧美一级午夜免费电影| 亚洲国产精品久久| 国产伊人精品| 亚洲永久免费精品| 亚洲人成在线观看网站高清| 麻豆久久久9性大片| 免费观看在线综合色| 夜夜爽夜夜爽精品视频| 久久久久国产一区二区三区| 精品99一区二区| 亚洲精品欧美日韩| 99亚洲精品| 亚洲一区二区三区高清不卡| 久久久精品国产免费观看同学| 欧美国产日韩xxxxx| 亚洲午夜精品网| 9国产精品视频| 亚洲二区精品| 久久免费视频一区| 久久国产高清| 午夜精品久久久久久久| 中国成人黄色视屏| 欧美黄色aaaa| 久久午夜精品一区二区|