亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lzw.java

?? LZW compression example with java
?? JAVA
字號:
/*The LZW Lib, Included as a part of the compression tutorial
 *Written By Martin Zolnieryk
 *
 *Thanks Goes to Mark Nelson and ever other person whos tutorials
 *aided in the writing of this.
 *
 *This code is freeware, however if you use this some credit
 *be nice.
*/

import java.io.*;

//This is the LZW Class
class Lzw
{
final int BUFFERSIZE  = 32;
final int CHARSIZE 	  = 8;
//The actual LZW table
boolean initStatus = false;
short [] prefix; //The Prefix, first code
short [] character;  //The char that is added to a code, always -1-255
short codesUsed;    //How many CODES of Size are used
short codesReserved; //Which codes not used, usually 0-255 for ASCII
short lzwSize;      //Tells us how many LZW's were allocated
long buffer;        //32 bits of space, up to 16bit compression, only 24 bits used
int bufferBits;     //How many bits are stored in the buffer
int bits;           //How many bits per code
short bufferSize;   //Used for gif, and other possible lzw implentations
short toNBuffer;    //Used for gif, how much before new buffer must be allocated
short [] stringBuffer; //The string buffer

//Doesnt do anything
public Lzw ()
{

}
//Contruct with init call
public Lzw(int bits)
{
	init(bits);
}


//Sets up library
public void init (int bits)
{
	prefix =  new short[1<<bits];
	character = new short[1<<bits];
	stringBuffer = new short[1<<bits];
	lzwSize =  (short)(1<<(bits)-1); //One less, becuase of 0 :)
	codesUsed = 0;
	codesReserved = 255;
	buffer = 0;
	bufferBits = 0;
	this.bits = bits;
	bufferSize = 0; //tells how big buffer chunks are
	toNBuffer = 0;
	initStatus = true;
	clearTable();
}

//Clears the table's values
//Used mainly for gif clearing
public void clearTable()
{
if(initStatus)
{
	for(int looper = 0; looper < lzwSize+1; looper++)
	{
    	prefix[looper] = 0; 
    	character[looper] = -1; //Would use 0, but NULL uses it
    	stringBuffer[looper] = 0;
	}
}
}

//Does a complete clean up
public void clearTableFull(int bits)
{
//Some Error Checking
if(initStatus)
{
	//Clear Table
	clearTable();
	codesUsed = 0;
	codesReserved = 255;
	buffer = 0;
	bufferBits = 0;
	this.bits = bits;
	bufferSize = 0; //tells how big buffer chunks are
	toNBuffer = 0;
}
}



//This writes a code to a file, really cool stuff.
//We support a max of 16 bit compression
private int writeCode(OutputStream fp,int code)
{

if(!initStatus)
 return -1;
//Some bit manipulation
buffer |= code << (bufferBits);
bufferBits+=bits;
while(bufferBits >=CHARSIZE)//Never go less than 8 or we loose data
 {
  try{
     fp.write((byte)buffer); //Only write the first 8 bits
     }
  catch(IOException e)
  {
  System.out.println("write error"+ e.getMessage());
  }
  buffer >>>=CHARSIZE; //Remove the byte from the buffer
  bufferBits-= CHARSIZE; //Buffer now stores one less byte
 }
return 0;
}




//Flushes if anything left
private void flushWriteCode(OutputStream fp)
{
if(initStatus)
if(bufferBits > 0)
 writeCode(fp, 0);
}

//This gets a gif code from the file
//this time, we work backwards
private int getCode(InputStream fp)
{
long temp;
//int test;
if(!initStatus)
 return 0;
while(bufferBits <=(BUFFERSIZE - CHARSIZE *2))//Never go over than size - or we loose data
{											  //Also never use full 64 bits, to avoid issues
	//No point reading anymore, files done :p
	try
	{
	if(fp.available() <= 0)
	      break;

	   //test = fp.read();
	   //buffer |= test << bufferBits;
	   buffer |= fp.read() <<(bufferBits);
	   bufferBits+= CHARSIZE; //Buffer now stores one more char.


	}

	catch(IOException e)
	{
	System.out.println("Error in getCode" + e.getMessage());
	}
}
	temp = (buffer << (64-bits)) >>> (64-bits); //We remove the excess bits
	buffer >>>= bits; //Remove the bits from buffer
	bufferBits -= bits;
	return (int)temp; //we return the correct code
}




//This is a little handy tool that returns the string
//Corrosponding to the appropriate string ID.
//Returns the size of the string
int getString(int codeNumber)
{
int looper = 0;
if(!initStatus)
 return -1;
 while(codeNumber > codesReserved)
 { 
  stringBuffer[looper] = character[codeNumber];
  codeNumber = prefix[codeNumber];
  looper++; 
 }
 stringBuffer[looper] = (short)codeNumber;
 looper++;
 stringBuffer[looper] = '\0'; //End of string
 return looper;
}



//This formula is really easy to understand
//Simply Does a brute-force search throught the entire table
//However, it is optimized not to look at lower code values then itself
int findCode(int stringBuffer, int character)
{
 if(!initStatus)
  return -1;
//The Search
for(int looper = stringBuffer; looper <= codesUsed+codesReserved;looper++)
 {
  //If we find a match
  if(stringBuffer == prefix[looper] && character == this.character[looper])
    return looper;
 }
//If not we return the next available code 
return codesUsed + 1 +codesReserved;
}



//Self Explantory, compresses a file
public int compressFile(String in, String out)
{
BufferedInputStream fileIn;
BufferedOutputStream fileOut;

int nextChar = 0;      //Check psuedo code, grabs next char
int stringBuffer = 0;  //Check the psuedo code, hold string info
int codeNumber = 0;    //Holds code value for STRING_BUFFER
boolean written = false;
if(!initStatus)
 return -1;

//We try to load the file
try
{
	fileIn = new BufferedInputStream (new FileInputStream (in));
	fileOut = new BufferedOutputStream(new FileOutputStream(out));
	clearTableFull(bits);
	stringBuffer=fileIn.read();  //Get the first code
}
catch(IOException e)
{
	System.out.println("Unable to load file " + e.getMessage());
	return -1;
}

try{
while((nextChar = fileIn.read())!= -1) //End when the file is finished
  {
   //get next code
    codeNumber = findCode(stringBuffer,nextChar); //look for entry
    if (character[codeNumber] != -1)  //If its in the table
    {
    
        stringBuffer= codeNumber;     
        written = false;
    }
    else   //If its not in the table
    {                                      
        //We can only add new entries if the table is not full  
        if (codesUsed+ codesReserved < lzwSize-1)
        {
          prefix[codeNumber]= (short)stringBuffer;
          character[codeNumber]=(short)nextChar;
          codesUsed++;
        }
		
         //We write the code
        writeCode(fileOut,stringBuffer);
        written = true;
        //Start again
        stringBuffer=nextChar;     
    }                                
  }                                  
  }
    catch(IOException e){System.out.println("Error in compressFile" +e.getMessage());}
//Make sure we didnt forget to write one last code
if(!written)
	writeCode(fileOut,stringBuffer);
//This is our little way of saying the file is finished, this code number
//is not used
writeCode(fileOut,lzwSize); //ENDOFFILE
//Will flush the buffer if any codes need to be flushed
flushWriteCode(fileOut);
//Close Files
try
{
fileIn.close();
fileOut.close();
}
catch(IOException e){System.out.println("Couldnt close files " +e.getMessage());}
return 0;
}



//Does the oposite of the routine above
int decompressFile(String in, String out)
{
BufferedInputStream fileIn;
BufferedOutputStream fileOut;
int looper;
int firstCode = -1;      //Check psuedo code, is the previous code
int nextCode = 0;  //Name is self explanatory   
int firstChar = 0;      //Is used if the code is not in the table

if(!initStatus) //
	return -1;
//Load Files
try
{
	fileIn = new BufferedInputStream (new FileInputStream (in));
	fileOut = new BufferedOutputStream(new FileOutputStream(out));
	clearTableFull(bits);
}
catch(IOException e)
{
	System.out.println("Unable to load file " + e.getMessage());
	return -1;
}

clearTableFull(bits);
//Do the initialization
firstCode = getCode(fileIn);
firstChar = firstCode;         

try{
fileOut.write(firstCode);
//We start the main loop
while((nextCode = getCode(fileIn))!= lzwSize)
  {

   //This is some error checking, basically
   //If a the buffer is empty, and the file is finshed, exit!
   if(nextCode == -1)
   {
    if(bufferBits == 0)
      break;
   }  
    //If not in table
    if (nextCode > codesUsed + codesReserved)          
    {
      codesUsed++;
      prefix[nextCode]= (short)firstCode;
      character[nextCode]=(short)firstChar;
      looper = getString(nextCode);
    }
    //If the code was already in the table
    //See if we can add a new code to the table
    //Make sure we have not gone over the table size
    else if(codesUsed + codesReserved < lzwSize )                                   
    {                                       
        looper = getString(nextCode);
        codesUsed++;
        prefix[codesUsed +codesReserved]= (short)firstCode;
        character[codesUsed +codesReserved]=stringBuffer[looper-1];
    }
    else //Normal 0-255 ascii char
      looper = getString(nextCode);


    //We write out the decompressed code to the file
    firstChar = stringBuffer[looper-1];    
    firstCode = nextCode;
 
    while(looper > 0)
     {
 
      fileOut.write(stringBuffer[looper-1]);
      fileOut.flush();
      looper--;
     }
 
  } 
  }
  catch(IOException e){System.out.println("Error in decompressFile" + e.getMessage());
  }

//Close Files
try
{
fileIn.close();
fileOut.close();
}
catch(IOException e){System.out.println("Couldnt close files" +e.getMessage());}
return 0;
}




}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品自拍| 国产亚洲成av人在线观看导航| 国产精品人妖ts系列视频| 国产在线一区观看| 国产天堂亚洲国产碰碰| 国产精品一二三四五| 欧美韩国日本综合| 91在线视频观看| 亚洲一区中文日韩| 欧美日韩一区高清| 欧美a一区二区| 久久久久久影视| 99视频在线精品| 亚洲成人中文在线| 久久综合久久综合亚洲| 不卡免费追剧大全电视剧网站| 成人免费在线观看入口| 欧美亚洲丝袜传媒另类| 美女脱光内衣内裤视频久久网站| 精品噜噜噜噜久久久久久久久试看 | 国产清纯白嫩初高生在线观看91 | 偷窥国产亚洲免费视频| 欧美美女直播网站| 奇米在线7777在线精品 | 99久久综合色| 亚洲精品久久久久久国产精华液| 在线视频观看一区| 日韩国产欧美在线播放| 亚洲精品一区在线观看| 国产精品一色哟哟哟| 国产精品高潮呻吟| 欧洲亚洲精品在线| 麻豆成人久久精品二区三区小说| 2024国产精品视频| 国产99久久久精品| 亚洲一区二区三区中文字幕| 4438x成人网最大色成网站| 亚洲一区二区视频在线观看| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 一区二区三区色| 欧美日韩高清一区二区三区| 国产精品一区二区久久不卡| 国产色一区二区| 在线精品视频小说1| 精品一区二区三区视频| 中文字幕av一区 二区| 欧美日韩成人在线| 国产一区二区在线免费观看| 亚洲三级在线免费观看| 91精品国产综合久久国产大片| 国产一区啦啦啦在线观看| 一区二区三区资源| 久久伊人中文字幕| 欧美日韩亚洲综合一区| 国产一区二区中文字幕| 亚洲成人免费视频| ...xxx性欧美| 久久欧美一区二区| 欧美日韩精品系列| 成人黄色777网| 美女一区二区在线观看| 亚洲精品免费播放| 国产女人aaa级久久久级 | 91精彩视频在线| 国产不卡一区视频| 免费观看91视频大全| 一区二区在线免费观看| 久久综合色婷婷| 欧美一区二区日韩一区二区| 91亚洲资源网| 国产精品白丝jk白祙喷水网站| 日韩精品每日更新| 亚洲另类春色国产| 国产精品美女久久久久久久网站| 日韩一区二区精品葵司在线| 欧美在线免费视屏| 北条麻妃国产九九精品视频| 精品一区二区三区在线播放视频| 丝袜脚交一区二区| 亚洲精选在线视频| 国产精品国产三级国产普通话蜜臀| 欧美www视频| 欧美精品1区2区| 欧洲av在线精品| 在线一区二区视频| 在线中文字幕一区| 欧洲一区在线观看| 国产成人免费av在线| 亚洲一区二区视频在线观看| 国产欧美一区二区精品秋霞影院| 欧美日韩一区不卡| gogogo免费视频观看亚洲一| 国产精品一区二区在线观看不卡| 久久99精品国产麻豆婷婷| 蜜桃视频在线观看一区| 麻豆成人免费电影| 激情综合色播激情啊| 久久成人免费日本黄色| 久久精品国产99久久6| 欧美96一区二区免费视频| 蜜桃视频在线观看一区二区| 久久国产福利国产秒拍| 国产综合色在线视频区| 韩国精品一区二区| 国产精品12区| 成人黄动漫网站免费app| 91一区一区三区| 精品污污网站免费看| 欧美日韩mp4| 欧美一卡二卡三卡| 久久九九影视网| 久久精品视频免费| 亚洲色图制服诱惑| 亚洲v中文字幕| 蜜桃91丨九色丨蝌蚪91桃色| 国产自产v一区二区三区c| 国产精品18久久久久久久久久久久 | 欧美一级在线免费| 久久久99精品免费观看不卡| 国产欧美精品一区二区色综合朱莉| 国产精品区一区二区三| 亚洲午夜在线电影| 琪琪久久久久日韩精品| 岛国精品在线观看| 日本丶国产丶欧美色综合| 日韩一区二区三区视频在线观看| 久久久久久免费网| 亚洲乱码国产乱码精品精的特点 | 欧美国产精品v| 一区二区三区资源| 久久成人精品无人区| 成人国产亚洲欧美成人综合网| 99精品久久久久久| 欧美日韩国产中文| 国产精品久久看| 日韩电影免费一区| www.亚洲色图| 日韩一区二区三区在线观看| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 久久综合九色综合久久久精品综合 | 国产呦萝稀缺另类资源| 在线观看一区二区精品视频| 中文字幕一区二区三区四区 | 99久久婷婷国产综合精品电影| 欧美色视频在线| 久久精品亚洲国产奇米99| 国产精品进线69影院| 亚洲免费观看高清完整版在线| 九九精品视频在线看| 91福利在线导航| 国产日本欧洲亚洲| 日韩高清不卡一区| 99re成人精品视频| 久久免费午夜影院| 日韩va欧美va亚洲va久久| 99国产精品久久久久久久久久久| 欧美一级免费观看| 一区二区不卡在线视频 午夜欧美不卡在| 卡一卡二国产精品| 欧美日韩国产另类一区| 亚洲免费观看高清完整版在线| 国产麻豆视频一区| 欧美一级理论性理论a| 一区二区三区日韩精品| 国产.精品.日韩.另类.中文.在线.播放 | 欧美日韩美少妇| 亚洲色图在线播放| 国产精品亚洲成人| 久久久久国产免费免费| 丝袜美腿高跟呻吟高潮一区| 91欧美一区二区| 国产精品丝袜黑色高跟| 狠狠狠色丁香婷婷综合激情 | 欧美一区二区在线观看| 亚洲黄色免费电影| 91麻豆成人久久精品二区三区| 中文字幕成人网| 国产精品2024| 久久久精品天堂| 国内外精品视频| 欧美成人一级视频| 玖玖九九国产精品| 欧美va亚洲va国产综合| 蜜臀av一区二区在线观看| 6080亚洲精品一区二区| 亚洲六月丁香色婷婷综合久久| 成人午夜伦理影院| 久久久久久黄色| 午夜精品福利在线| 在线观看欧美日本| 一区二区三区免费网站| 色国产综合视频| 性做久久久久久| 51午夜精品国产| 美女网站视频久久| 久久久久久电影| 9久草视频在线视频精品| 亚洲视频狠狠干| 欧美色图免费看| 午夜成人免费视频|