我在Delphi XE2工作 我正在使用此
将base64字节数组转换为字符串TEncoding.UTF7.GetString(byte1)
然后使用此函数将字符串解码为字节数组
function Base64Decode(const EncodedText: string): TBytes;
var
DecodedStm: TBytesStream;
Decoder: TIdDecoderMIME;
begin
Decoder := TIdDecoderMIME.Create(nil);
try
DecodedStm := TBytesStream.Create;
try
Decoder.DecodeBegin(DecodedStm);
Decoder.Decode(EncodedText);
Decoder.DecodeEnd;
Result := DecodedStm.Bytes;
finally
DecodedStm.Free;
end;
finally
Decoder.Free;
end;
end;
但输入字符串长度为400,解码后其字节数组长度为8192。
某处它正在添加额外的空间......任何建议都是我做错了什么?
编辑...
这是我的数据的base64从c#通过tcp发送到delphi XE2应用程序 字符串长度= 400
TVpQAAIAAAAEAA8A//8AALgAAAAAAAAAQAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAALoQAA4ftAnNIbgBTM0hkJBUaGlzIHByb2dyYW0gbXVzdCBiZSBydW4gdW5kZXIgV2luMzINCiQ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBFAABMAQgAGV5CKgAAAAAAAAAA4ACOgQsBAhkArAoAAMQCAAAAAAAwugoA
当我将TBytes转换为字符串后,我在delphi应用程序中收到TBytes
Tbytes为UTF-7字符串 字符串长度= 401
TVpQAAIAAAAEAA8A//8AALgAAAAAAAAAQAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAALoQAA4ftAnNIbgBTM0hkJBUaGlzIHByb2dyYW0gbXVzdCBiZSBydW4gdW5kZXIgV2luMzINCiQ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBFAABMAQgAGV5CKgAAAAAAAAAA4ACOgQsBAhkArAoAAMQCAAAAAAAwugoA
TByte为UTF-8字符串 字符串长度= 0(零)
TByte到ANSI字符串 字符串长度= 401
TVpQAAIAAAAEAA8A//8AALgAAAAAAAAAQAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAALoQAA4ftAnNIbgBTM0hkJBUaGlzIHByb2dyYW0gbXVzdCBiZSBydW4gdW5kZXIgV2luMzINCiQ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBFAABMAQgAGV5CKgAAAAAAAAAA4ACOgQsBAhkArAoAAMQCAAAAAAAwugoA
之间有一个额外的位,但我不知道为什么会这样。
善意的建议我做错了什么。
答案 0 :(得分:3)
您可以添加一行来获得您期望的长度:
function Base64Decode(const EncodedText: string): TBytes;
var
DecodedStm: TBytesStream;
Decoder: TIdDecoderMIME;
begin
Decoder := TIdDecoderMIME.Create(nil);
try
DecodedStm := TBytesStream.Create;
try
Decoder.DecodeBegin(DecodedStm);
Decoder.Decode(EncodedText);
Decoder.DecodeEnd;
Result := DecodedStm.Bytes;
SetLength(Result, DecodedStm.Size); // add this line
finally
DecodedStm.Free;
end;
finally
Decoder.Free;
end;
end;
答案 1 :(得分:2)
虽然将UTF7编码与Base64解码混合是一个非常糟糕的主意,但您应该使用 Soap.EncdDecd.pas EncodeBase64和DecodeBase64
>
答案 2 :(得分:1)
首先,你为什么要涉及UTF-7? Base64是一种仅使用ASCII字符的7位编码。将base64转换为UTF-7或从UTF-7转换是不必要的操作。如果您的TBytes
包含base64编码的字符八位字节,那么您只需将TBytes
直接复制到AnsiString
而无需进行任何解码:
var
byte1: TBytes;
s: AnsiString;
SetString(s, PAnsiChar(byte1), Length(byte));
或使用Indy的BytesToStringRaw()
功能:
var
byte1: TBytes;
s: String;
s := BytesToStringRaw(byte1);
无论哪种方式,只要您拥有base64编码的字符串,就可以使用Base64Decode()
方法完全取消自定义TIdDecoderMIME.DecodeBytes()
功能:
var
decoded: TBytes;
decoded := TIdDecoderMIME.DecodeBytes(s);