Как удалить разрыв строки в строке, которая кодируется функцией EncodeString с Delphi 7?
Я использую EncodeString в Delphi 7 для кодирования строк, которые загружаются из исходного текстового файла. В исходном текстовом файле каждая строка представляет собой одну запись. Теперь я хочу использовать функцию EncodeString, которая является функцией Base64, для кодирования каждой строки строки и записи в новый целевой текстовый файл. Моя цель состоит в том, чтобы в исходном текстовом файле строки из одной строки кодировались в одну строку в зашифрованном текстовом файле. Но каждая строка кодирует до 3 строк строки шифрования. Есть несколько разрывов строк, сделанных на 3 строки. Как я могу удалить перевод строки?
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i,sum:integer;
begin
memoSource.Lines.LoadFromFile('source.txt');
sum:=memoSource.Lines.Count;
assignFile(targetFile,'target.txt');
rewrite(targetFile);
memoTarget.Clear;
for i:=0 to sum-1 do
begin
memoTarget.Lines.Append(EncodeString(memoSource.Lines.Strings[i]));
Writeln(targetFile,EncodeString(memoSource.Lines.Strings[i]));
//Write(targetFile,EncodeString(memoSource.Lines.Strings[i])); //use write but line-feed still in the strings
end;
end;
это исходный текст:
line 1: this is a soure text to test , every line is one record. this is a soure text to test , every line is one record. this is a soure text to test , every line is one record.
line 2: this is a soure text to test , every line is one record. this is a soure text to test , every line is one record. this is a soure text to test , every line is one record.
line 3: this is a soure text to test , every line is one record. this is a soure text to test , every line is one record. this is a soure text to test , every line is one record. code here
это текстовое содержимое EncodeString:
bGluZSAxOiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLg==
bGluZSAyOiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLg==
bGluZSAzOiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZS
Мне нужен разрыв строки в конце каждой целевой строки текстового файла, чтобы я мог различить каждую строку.
большое спасибо!
2 ответа
Это как EncodeStream
процедура (которая EncodeString
звонки) в 'encddecd.pas' кодируется. Это, вероятно, соответствует RFC 2045 (кодирование передачи для MIME). Выдержка:
procedure EncodeStream(Input, Output: TStream);
type
PInteger = ^Integer;
var
InBuf: array[0..509] of Byte;
OutBuf: array[0..1023] of Char;
BufPtr: PChar;
I, J, K, BytesRead: Integer;
Packet: TPacket;
begin
K := 0;
repeat
...
...
Inc(BufPtr, 4);
Inc(K, 4);
if K > 75 then
begin
BufPtr[0] := #$0D;
BufPtr[1] := #$0A;
Inc(BufPtr, 2);
K := 0;
end;
end;
Output.Write(Outbuf, BufPtr - PChar(@OutBuf));
until BytesRead = 0;
end;
Как вы можете видеть, после каждых 76 байтов перевод строки и возврат каретки добавляются в выходной буфер.
Вы можете использовать EncodeString
вместо этого в пакете Indy:
uses
idcodermime
...
Writeln(targetFile, TIdEncoderMIME.EncodeString(memoSource.Lines.Strings[i]));
Дешевый способ заключается в использовании StringReplace
str := StringReplace(str, sLinebreak, '', [rfReplaceAll]);
Если вы хотите удалить разрыв строки в исходном коде, вы можете изменить исходный код вашего кодировщика. Найдите часть, которая добавляет разрыв строки, и удалите ее.
Это наивный прямой ответ на ваш вопрос. Более авантюрным ответом было бы сказать, что вы должны закодировать весь список строк за один раз, разрывы строк и все. Вместо кодирования построчно, кодировать memoSource.Lines.Text
,
Также возникает вопрос, почему вы выбрали кодирование в base64. Я ожидаю увидеть base64, используемый для преобразования двоичного кода в текст для передачи по каналу, который принимает только текст ASCII. Если у вас уже есть текст, почему вы используете его для кодирования 64?