如何用Delphi7删除函数EncodeString编码的字符串中的换行符?

如何用Delphi7删除函数EncodeString编码的字符串中的换行符?,delphi,base64,line-breaks,linefeed,Delphi,Base64,Line Breaks,Linefeed,我在Delphi7中使用EncodeString对从源文本文件加载的字符串进行编码。在源文本文件中,每行都是一条记录。现在,我想使用函数EncodeString,它是Base64函数,对每一行字符串进行编码,并写入一个新的目标文本文件。我的目的是源文本文件中的单行字符串应编码为目标文本文件中的单行加密字符串。但每行编码为3行加密字符串。3行中有几行换行符。如何删除换行符 代码: 这是源文本内容: line 1: this is a soure text to test , every line

我在Delphi7中使用EncodeString对从源文本文件加载的字符串进行编码。在源文本文件中,每行都是一条记录。现在,我想使用函数EncodeString,它是Base64函数,对每一行字符串进行编码,并写入一个新的目标文本文件。我的目的是源文本文件中的单行字符串应编码为目标文本文件中的单行加密字符串。但每行编码为3行加密字符串。3行中有几行换行符。如何删除换行符

代码:

这是源文本内容:

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
bGluZSAxOiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLg==
bGluZSAyOiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLg==
bGluZSAzOiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZS
这是编码字符串文本内容:

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
bGluZSAxOiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLg==
bGluZSAyOiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLg==
bGluZSAzOiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZSBpcyBvbmUg
cmVjb3JkLiB0aGlzIGlzIGEgc291cmUgdGV4dCB0byB0ZXN0ICwgZXZlcnkgbGluZS
我需要在每个目标文本文件的行尾都有一个换行符,这样我就可以区分每一行。


非常感谢

便宜的方法是使用
StringReplace

str := StringReplace(str, sLinebreak, '', [rfReplaceAll]);
如果要在源代码处删除换行符,可以修改编码器的源代码。找到添加换行符的零件,然后将其删除

这是对你问题的天真直接的回答。一个更大胆的回答是,您应该一次性编码整个字符串列表,换行符和所有字符。不要逐行编码,而是编码
memoSource.Lines.Text


人们还想知道为什么选择base64编码文本。我希望看到base64用于将二进制转换为文本,以便通过只接受ASCII文本的管道进行传输。如果你已经有了文本,为什么要用base64编码呢?

便宜的方法是使用
StringReplace

str := StringReplace(str, sLinebreak, '', [rfReplaceAll]);
如果要在源代码处删除换行符,可以修改编码器的源代码。找到添加换行符的零件,然后将其删除

这是对你问题的天真直接的回答。一个更大胆的回答是,您应该一次性编码整个字符串列表,换行符和所有字符。不要逐行编码,而是编码
memoSource.Lines.Text


人们还想知道为什么选择base64编码文本。我希望看到base64用于将二进制转换为文本,以便通过只接受ASCII文本的管道进行传输。如果您已经有文本,为什么要对其进行base 64编码?

这是“encddecd.pas”中
EncodeStream
过程(调用
EncodeString
的过程)的编码方式。它可能符合(传输编码)。摘录:

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个字节后,输出缓冲区中就会追加一个换行符和一个回车符


您可以使用Indy软件包中的
EncodeString

uses
  idcodermime

...

Writeln(targetFile, TIdEncoderMIME.EncodeString(memoSource.Lines.Strings[i]));

这是“encddecd.pas”中
EncodeStream
过程(调用
EncodeString
的过程)的编码方式。它可能符合(传输编码)。摘录:

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个字节后,输出缓冲区中就会追加一个换行符和一个回车符


您可以使用Indy软件包中的
EncodeString

uses
  idcodermime

...

Writeln(targetFile, TIdEncoderMIME.EncodeString(memoSource.Lines.Strings[i]));