在delphi中有一个函数base64编码没有CRLF的字符串吗?

时间:2018-01-20 11:53:46

标签: delphi

在delphi中是否有一个函数base64编码没有CRLF的字符串?我尝试使用TnetEncoding.Base64.Encode(MyStr),但结果字符串包含CRLF(换行符)

2 个答案:

答案 0 :(得分:9)

是的,有TBase64Encoding使用特定参数构建。有三种不同的构造函数重载。默认TNetEncoding.Base64实例使用默认实例构建。使用其他两个构造函数,您可以指定每行的字符数和行分隔符。

constructor Create; overload; virtual;
constructor Create(CharsPerLine: Integer); overload; virtual;
constructor Create(CharsPerLine: Integer; LineSeparator: string); overload; virtual;

如果将空字符串指定为新行分隔符,则结果将不会有新行字符。

var
  s, Encoded: string;
  Base64: TBase64Encoding;

  s := 'Some larger text that needs to be encoded in Base64 encoding';
  Base64 := TBase64Encoding.Create(10, '');
  Encoded := Base64.Encode(s);

输出:

U29tZSBsYXJnZXIgdGV4dCB0aGF0IG5lZWRzIHRvIGJlIGVuY29kZWQgaW4gQmFzZTY0IGVuY29kaW5n

David' answer

提供了一个更好的解决方案

使用第二个构造函数并传递0作为参数省略换行符。

Base64 := TBase64Encoding.Create(0);

答案 1 :(得分:2)

您可以为此编写自己的功能。这很简单:

function EncodeBase64(const Input: TBytes): string;
const
  Base64: array[0..63] of Char =
    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

  function Encode3Bytes(const Byte1, Byte2, Byte3: Byte): string;
  begin
    Result := Base64[Byte1 shr 2]
      + Base64[((Byte1 shl 4) or (Byte2 shr 4)) and $3F]
      + Base64[((Byte2 shl 2) or (Byte3 shr 6)) and $3F]
      + Base64[Byte3 and $3F];
  end;

  function EncodeLast2Bytes(const Byte1, Byte2: Byte): string;
  begin
    Result := Base64[Byte1 shr 2]
      + Base64[((Byte1 shl 4) or (Byte2 shr 4)) and $3F]
      + Base64[(Byte2 shl 2) and $3F] + '=';
  end;

  function EncodeLast1Byte(const Byte1: Byte): string;
  begin
    Result := Base64[Byte1 shr 2]
      + Base64[(Byte1 shl 4) and $3F] + '==';
  end;

var
  i, iLength: Integer;
begin
  Result := '';
  iLength := Length(Input);
  i := 0;
  while i < iLength do
  begin
    case iLength - i of
      3..MaxInt:
        Result := Result + Encode3Bytes(Input[i], Input[i+1], Input[i+2]);
      2:
        Result := Result + EncodeLast2Bytes(Input[i], Input[i+1]);
      1:
        Result := Result + EncodeLast1Byte(Input[i]);
    end;
    Inc(i, 3);
  end;
end;

使用字符串:

EncodeBase64(BytesOf(MyStr));