Как убрать нули при записи BlowFish

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Как убрать нули при записи BlowFish

Сообщение resident »

Здрасть :)
Шифрую поток памяти в файловый поток. При расшифровке в конце файла получаются нули.
В хелпе пишут, что алгоритм пишет по 4 байта, может с этим связано? Но в конце получается и например шесть NUL.
Изображение
Data is always written 4 bytes at a time, since this is the amount of bytes required by the Blowfish algorithm. If no multiple of 4 was written to the destination stream, the Flush mechanism can be used to write the remaining bytes.

Как бы избавиться от этих нулей?
з.ы. Пока придумал расшифровывать в TStringStream, его копировать в TStringList, а там уже смотреть каждую строку и удалять нули. Но в итоге мне нужен TMemoryStream и я TStringList копирую в него. Получается какая-то длинная цепочка.
TBlowFishDeCryptStream -> TStringStream -> TStringList -> TMemoryStream
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Если непечатаемые символы вообще не нужны - можно перед шифрованием вырезАть все ASCII-коды ниже 32. А табуляции заменять например 4-мя пробелами, а LF заменять например "<BR>" (как в HTML).
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Спасиб :)
Но хотелось бы какого-то упрощения. Сложный путь у меня и так работал.
Вобщем теперь работа только с TMemoryStream, благодаря функции

Код: Выделить всё

procedure RemoveNullFromMemoryStream(Stream: TMemoryStream);

Отсюда:
http://stackoverflow.com/questions/18801835/cannot-remove-null-characters-from-a-string
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Код: Выделить всё

procedure RemoveNullFromMemoryStream(Stream: TMemoryStream);

Есть подозрение что метод "StringReplace(str, #0, '', [rfReplaceAll]);" на большом объеме данных будет очень медленным (из-за копирования потока самого на себя со сдвигом). Лучше было бы пофрагментно собирать печатаемые фрагменты потока в строку - и возвращать уже ее.
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Ok :)
Ответить