在delphi中是否有一个函数base64编码没有CRLF的字符串?我尝试使用TnetEncoding.Base64.Encode(MyStr),但结果字符串包含CRLF(换行符)
答案 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));