Как удалить разрыв строки в строке, которая кодируется функцией 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?

Другие вопросы по тегам