Не могу понять часть кода.
Код:
long block = 0;
int counter = 0;
try{
while (true){
block |= in.readUnsignedByte();
counter++;
if(counter==8){
out.writeLong(Cipher.Encrypt(key, block));
counter=0; block=0;
}else{
block = block<<8;
}
}
}catch(EOFException e){ // вот тут не особо понятно что происходит
block |= 0x80;
counter++;
while (counter < 8) {
block = block << 8;
++counter;
}
out.writeLong(SkipJack.Encrypt(key, block));
}
int counter = 0;
try{
while (true){
block |= in.readUnsignedByte();
counter++;
if(counter==8){
out.writeLong(Cipher.Encrypt(key, block));
counter=0; block=0;
}else{
block = block<<8;
}
}
}catch(EOFException e){ // вот тут не особо понятно что происходит
block |= 0x80;
counter++;
while (counter < 8) {
block = block << 8;
++counter;
}
out.writeLong(SkipJack.Encrypt(key, block));
}
Код:
long thisBlock = 0;
long nextBlock = 0;
try{
thisBlock = in.readLong();
while (true){
nextBlock = in.readLong();
out.writeLong(SkipJack.Decrypt(key, thisBlock));
thisBlock = nextBlock;
}
}catch(EOFException e){
// вот тут тоже не пойму
thisBlock = SkipJack.Decrypt(key, thisBlock);
int numDataBytes = 7 - (Long.numberOfTrailingZeros(thisBlock) / 8);
byte[] finalbytes = ByteBuffer.allocate(8).putLong(thisBlock).array();
out.write(finalbytes, 0, numDataBytes);
}
long nextBlock = 0;
try{
thisBlock = in.readLong();
while (true){
nextBlock = in.readLong();
out.writeLong(SkipJack.Decrypt(key, thisBlock));
thisBlock = nextBlock;
}
}catch(EOFException e){
// вот тут тоже не пойму
thisBlock = SkipJack.Decrypt(key, thisBlock);
int numDataBytes = 7 - (Long.numberOfTrailingZeros(thisBlock) / 8);
byte[] finalbytes = ByteBuffer.allocate(8).putLong(thisBlock).array();
out.write(finalbytes, 0, numDataBytes);
}
когда срабатывает исключение "конец файла" (catch(EOFException e)) управление передается следующему блоку
block |= 0x80; //устанавливаем признак того, что данный блок (из восьми байт неполный)
counter++;
while (counter < 8) { //заполняем недостающие до 8 байтов места нулями
block = block << 8;
++counter;
}
out.writeLong(SkipJack.Encrypt(key, block)); //шифруем как обычный блок из восьми байт
на дешифровании обратный процесс (дурость имхо там в "предпрочитывании" следующего лонга - но она нужна чтобы попасть на последнем лонге в исключение )
да, еще на дешифровании учитывается, что один байт занят признаком, собственно поэтому numDataBytes = 7 - (Long.numberOfTrailingZeros(thisBlock) / 8)