Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не могу понять часть кода.

32K
27 марта 2013 года
xface
43 / / 07.11.2009
Привет. Помогите пожалуйста понять часть кода. Этот код записывает блоки данных по 8 байт в файл, но если последний блок имеет длину не 8 байт, то как что он дописывает в конец? И как происходит чтение последнего блока, если он не ровно 8 байт. Спасибо.


Код:
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));
        }
И вот еще один:

Код:
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);
        }
90K
28 марта 2013 года
vzv123
1 / / 28.03.2013
Ну в принципе ничего непонятного нет

когда срабатывает исключение "конец файла" (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)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог