错误类型:出错误尝试读取或写入受保护的内存。这通常指示其他内存已损坏。C#源码
[DllImport("Base64.dll")]
public static extern string Base64ToStr(string Base64);protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Base64ToStr("YWRtaW4="));
}delphi 源码unit Base;interfaceuses ShareMem,SysUtils, Classes;// 将SourceSize长度的源Source编码为Base64字符串返回
function Base64Encode(const Source; SourceSize: Integer): string; overload;
// 将Source从StartPos开始的Size长度的内容源编码为Base64,写入流Dest。Size=0文件结束
procedure Base64Encode(Source, Dest: TStream; StartPos: Int64 = 0; Size: Int64 = 0); overload;
// 把字符串Str编码为Base64字符串返回
function StrToBase64(Str: string): string;stdcall;// 按给定的编码源Source和长度Size计算并返回解码缓冲区实际所需长度
function Base64DecodeBufSize(const Source; Size: Integer): Integer;
// 将Base64编码字符串Source解码存放在Buf中,返回解码长度
function Base64Decode(const Source: string; var Buf): Integer; overload;
// 将Source从StartPos开始的Size长度的Base64编码内容解码,写入流Dest。Size=0文件结束
procedure Base64Decode(Source, Dest: TStream; StartPos: Int64 = 0; Size: Int64 = 0); overload;
// 把Base64字符串解码为字符串返回
function Base64ToStr(Base64: string): string;stdcall;implementationconst
Base64_Chars: array[0..63] of char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
Base64_Bytes: array[0..79] of byte = (
62, 0, 0, 0, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
47, 48, 49, 50, 51
);
type
Base64Proc = function(const Source; var Buf; SourceSize: Integer): Integer;function Base64_Encode(const Source; var Buf; SourceSize: Integer): Integer;
asm
push ebp
push esi
push edi
push ebx
mov esi, eax // esi = Source
mov edi, edx // edi = Buf
mov eax, ecx
cdq
mov ecx, 3
div ecx
mov ecx, eax
test edx, edx // edx = SourceSize % 3
jz @@1
inc eax // eax = (SourceSize + 2) / 3
@@1:
push eax
push edx
lea ebp, Base64_Chars// ebp = Base64_Chars
jecxz @@3
cld // for (ecx = SourceSize / 3; ecx > 0; ecx --)
@Loop1: // {
mov edx, [esi] // edx = *(DWORD* )esi
add esi, 3 // esi += 3
bswap edx // bswap(edx)
shr edx, 8 // edx >>= 8
mov ebx, edi // ebx = edi
add edi, 4 // edi += 4
@Loop3: // while (ebx != edi)
dec edi // {
mov eax, edx // *--edi = (BYTE)Base64_Chars[edx & 63]
and eax, 63
movzx eax, byte ptr [ebp + eax]
mov [edi], al
shr edx, 6 // edx >= 6
cmp ebx, edi
jne @Loop3 // }
add edi, 4 // edi += 4
loop @Loop1 // }
@@3:
pop ecx // if (SourceSize % 3 == 0)
jecxz @end // return
push ecx
mov eax, ecx
mov ebx, 0ffffffffh // ebx = ~(-1 >> ((SourceSize % 3) * 8))
shl ecx, 3
shl ebx, cl
not ebx
mov edx, [esi] // edx = *(DWORD* )esi & ebx
and edx, ebx
bswap edx // bswap(edx)
mov ecx, eax
inc ecx
@Loop4: // for (ecx = SourceSize % 3 + 1; ecx > 0; ecx --)
rol edx, 6 // {
mov eax, edx // edx <<<= 6
and eax, 63 // *edi ++ = Base64_Chars[edx & 63]
movzx eax, [ebp + eax]
stosb
loop @Loop4 // }
pop ecx // for (ecx = 3 - (SourceSize % 3); ecx > 0; ecx --)
xor ecx, 3
mov al, 61
rep stosb // *edi++ = '='
@end:
pop eax
shl eax, 2 // return (SourceSize + 2) / 3 * 4
pop ebx
pop edi
pop esi
pop ebp
end;function Base64Encode(const Source; SourceSize: Integer): string;
begin
SetLength(Result, ((SourceSize + 2) div 3) shl 2);
Base64_Encode(Source, Result[1], SourceSize);
end;procedure Base64Stream(Source, Dest: TStream; Proc: Base64Proc;
StartPos, Size: Int64; RBufSize, WBufSize: Integer);
var
RBuf: array of Byte;
WBuf: array of Byte;
RSize, WSize: Integer;
begin
if (StartPos < 0) or (StartPos >= Source.Size) then Exit;
Source.Position := StartPos;
if (Size <= 0) or (Size > Source.Size - Source.Position) then
Size := Source.Size
else
Size := Size + Source.Position;
SetLength(RBuf, RBufSize);
SetLength(WBuf, WBufSize);
while Size <> Source.Position do
begin
RSize := Source.Read(RBuf[0], RBufSize);
WSize := Proc(RBuf[0], WBuf[0], RSize);
Dest.Write(WBuf[0], WSize);
end;
end;procedure Base64Encode(Source, Dest: TStream; StartPos: Int64; Size: Int64);
begin
Base64Stream(Source, Dest, Base64_Encode, StartPos, Size, 3072, 4096);
end;function StrToBase64(Str: string): string;
begin
Result := Base64Encode(Str[1], Length(Str));
end;function Base64DecodeBufSize(const Source; Size: Integer): Integer;
asm
push edi
mov edi, eax // edi = Source + Size - 1
add edi, edx
mov eax, edx // eax = Size / 4 * 3
shr edx, 2
shr eax, 1
add eax, edx
mov edx, eax
jz @@2
@@1:
dec edi
cmp byte ptr [edi], 61
jne @@2 // if ([edi] == '=')
dec eax // eax --
jmp @@1
@@2:
pop edi // return eax: BufSize; edx: SourceSize / 4 * 3
end;function Base64_Decode(const Source; var Buf; SourceSize: Integer): Integer;
asm
push ebp
push esi
push edi
push ebx
mov esi, eax // esi = Source
mov edi, edx // edi = Buf
mov edx, ecx
call Base64DecodeBufSize
push eax // eax = Base64DecodeBufSize(Source, SourceSize) // return value
add eax, edi // eax += edi
lea ebp, Base64_Bytes
cld
shr ecx, 2
jecxz @end
push eax
mov ebx, ecx // for (ebx = SourceSize / 4; ebx > 0; ebx --; edi += 3)
@Loop1: // {
mov ecx, 4
xor eax, eax // for (ecx = 4, eax = 0; ecx > 0; ecx --)
@Loop2: // {
movzx edx, byte ptr [esi]
inc esi // edx = *esi ++
sub edx, 43 // dl -= 43
shl eax, 6 // eax <<= 6
or al, [ebp + edx]// al |= Base64_Bytes[edx]
loop @Loop2 // }
cmp ebx, 1 // if (ebx == 1) break
jz @@2
bswap eax // bswap(eax)
shr eax, 8 // eax >>= 8
mov [edi], ax // *edi = ax
shr eax, 16 // eax >>= 16
mov [edi + 2], al // *(edi + 2) = al
add edi, 3 //
dec ebx
jnz @Loop1 // }
@@2:
pop ecx // for (ecx = Buf + BufSize, eax <<= 8; edi != ecx;)
shl eax, 8 // {
@Loop4:
cmp edi, ecx
je @end
rol eax, 8 // eax <<<= 8
stosb // *edi ++ = al
jmp @Loop4 // }
@end:
pop eax // return eax
pop ebx
pop edi
pop esi
pop ebp
end;function Base64Decode(const Source: string; var Buf): Integer;
begin
Result := Base64_Decode(Source[1], Buf, Length(Source));
end;procedure Base64Decode(Source, Dest: TStream; StartPos: Int64; Size: Int64);
begin
Base64Stream(Source, Dest, Base64_Decode, StartPos, Size, 4096, 3072);
end;function Base64ToStr(Base64: string): string;
begin
SetLength(Result, Base64DecodeBufSize(Base64, Length(Base64)));
Base64_Decode(Base64[1], Result[1], Length(Base64));
end;end.
看红色的就行
[DllImport("Base64.dll")]
public static extern string Base64ToStr(string Base64);protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Base64ToStr("YWRtaW4="));
}delphi 源码unit Base;interfaceuses ShareMem,SysUtils, Classes;// 将SourceSize长度的源Source编码为Base64字符串返回
function Base64Encode(const Source; SourceSize: Integer): string; overload;
// 将Source从StartPos开始的Size长度的内容源编码为Base64,写入流Dest。Size=0文件结束
procedure Base64Encode(Source, Dest: TStream; StartPos: Int64 = 0; Size: Int64 = 0); overload;
// 把字符串Str编码为Base64字符串返回
function StrToBase64(Str: string): string;stdcall;// 按给定的编码源Source和长度Size计算并返回解码缓冲区实际所需长度
function Base64DecodeBufSize(const Source; Size: Integer): Integer;
// 将Base64编码字符串Source解码存放在Buf中,返回解码长度
function Base64Decode(const Source: string; var Buf): Integer; overload;
// 将Source从StartPos开始的Size长度的Base64编码内容解码,写入流Dest。Size=0文件结束
procedure Base64Decode(Source, Dest: TStream; StartPos: Int64 = 0; Size: Int64 = 0); overload;
// 把Base64字符串解码为字符串返回
function Base64ToStr(Base64: string): string;stdcall;implementationconst
Base64_Chars: array[0..63] of char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
Base64_Bytes: array[0..79] of byte = (
62, 0, 0, 0, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
47, 48, 49, 50, 51
);
type
Base64Proc = function(const Source; var Buf; SourceSize: Integer): Integer;function Base64_Encode(const Source; var Buf; SourceSize: Integer): Integer;
asm
push ebp
push esi
push edi
push ebx
mov esi, eax // esi = Source
mov edi, edx // edi = Buf
mov eax, ecx
cdq
mov ecx, 3
div ecx
mov ecx, eax
test edx, edx // edx = SourceSize % 3
jz @@1
inc eax // eax = (SourceSize + 2) / 3
@@1:
push eax
push edx
lea ebp, Base64_Chars// ebp = Base64_Chars
jecxz @@3
cld // for (ecx = SourceSize / 3; ecx > 0; ecx --)
@Loop1: // {
mov edx, [esi] // edx = *(DWORD* )esi
add esi, 3 // esi += 3
bswap edx // bswap(edx)
shr edx, 8 // edx >>= 8
mov ebx, edi // ebx = edi
add edi, 4 // edi += 4
@Loop3: // while (ebx != edi)
dec edi // {
mov eax, edx // *--edi = (BYTE)Base64_Chars[edx & 63]
and eax, 63
movzx eax, byte ptr [ebp + eax]
mov [edi], al
shr edx, 6 // edx >= 6
cmp ebx, edi
jne @Loop3 // }
add edi, 4 // edi += 4
loop @Loop1 // }
@@3:
pop ecx // if (SourceSize % 3 == 0)
jecxz @end // return
push ecx
mov eax, ecx
mov ebx, 0ffffffffh // ebx = ~(-1 >> ((SourceSize % 3) * 8))
shl ecx, 3
shl ebx, cl
not ebx
mov edx, [esi] // edx = *(DWORD* )esi & ebx
and edx, ebx
bswap edx // bswap(edx)
mov ecx, eax
inc ecx
@Loop4: // for (ecx = SourceSize % 3 + 1; ecx > 0; ecx --)
rol edx, 6 // {
mov eax, edx // edx <<<= 6
and eax, 63 // *edi ++ = Base64_Chars[edx & 63]
movzx eax, [ebp + eax]
stosb
loop @Loop4 // }
pop ecx // for (ecx = 3 - (SourceSize % 3); ecx > 0; ecx --)
xor ecx, 3
mov al, 61
rep stosb // *edi++ = '='
@end:
pop eax
shl eax, 2 // return (SourceSize + 2) / 3 * 4
pop ebx
pop edi
pop esi
pop ebp
end;function Base64Encode(const Source; SourceSize: Integer): string;
begin
SetLength(Result, ((SourceSize + 2) div 3) shl 2);
Base64_Encode(Source, Result[1], SourceSize);
end;procedure Base64Stream(Source, Dest: TStream; Proc: Base64Proc;
StartPos, Size: Int64; RBufSize, WBufSize: Integer);
var
RBuf: array of Byte;
WBuf: array of Byte;
RSize, WSize: Integer;
begin
if (StartPos < 0) or (StartPos >= Source.Size) then Exit;
Source.Position := StartPos;
if (Size <= 0) or (Size > Source.Size - Source.Position) then
Size := Source.Size
else
Size := Size + Source.Position;
SetLength(RBuf, RBufSize);
SetLength(WBuf, WBufSize);
while Size <> Source.Position do
begin
RSize := Source.Read(RBuf[0], RBufSize);
WSize := Proc(RBuf[0], WBuf[0], RSize);
Dest.Write(WBuf[0], WSize);
end;
end;procedure Base64Encode(Source, Dest: TStream; StartPos: Int64; Size: Int64);
begin
Base64Stream(Source, Dest, Base64_Encode, StartPos, Size, 3072, 4096);
end;function StrToBase64(Str: string): string;
begin
Result := Base64Encode(Str[1], Length(Str));
end;function Base64DecodeBufSize(const Source; Size: Integer): Integer;
asm
push edi
mov edi, eax // edi = Source + Size - 1
add edi, edx
mov eax, edx // eax = Size / 4 * 3
shr edx, 2
shr eax, 1
add eax, edx
mov edx, eax
jz @@2
@@1:
dec edi
cmp byte ptr [edi], 61
jne @@2 // if ([edi] == '=')
dec eax // eax --
jmp @@1
@@2:
pop edi // return eax: BufSize; edx: SourceSize / 4 * 3
end;function Base64_Decode(const Source; var Buf; SourceSize: Integer): Integer;
asm
push ebp
push esi
push edi
push ebx
mov esi, eax // esi = Source
mov edi, edx // edi = Buf
mov edx, ecx
call Base64DecodeBufSize
push eax // eax = Base64DecodeBufSize(Source, SourceSize) // return value
add eax, edi // eax += edi
lea ebp, Base64_Bytes
cld
shr ecx, 2
jecxz @end
push eax
mov ebx, ecx // for (ebx = SourceSize / 4; ebx > 0; ebx --; edi += 3)
@Loop1: // {
mov ecx, 4
xor eax, eax // for (ecx = 4, eax = 0; ecx > 0; ecx --)
@Loop2: // {
movzx edx, byte ptr [esi]
inc esi // edx = *esi ++
sub edx, 43 // dl -= 43
shl eax, 6 // eax <<= 6
or al, [ebp + edx]// al |= Base64_Bytes[edx]
loop @Loop2 // }
cmp ebx, 1 // if (ebx == 1) break
jz @@2
bswap eax // bswap(eax)
shr eax, 8 // eax >>= 8
mov [edi], ax // *edi = ax
shr eax, 16 // eax >>= 16
mov [edi + 2], al // *(edi + 2) = al
add edi, 3 //
dec ebx
jnz @Loop1 // }
@@2:
pop ecx // for (ecx = Buf + BufSize, eax <<= 8; edi != ecx;)
shl eax, 8 // {
@Loop4:
cmp edi, ecx
je @end
rol eax, 8 // eax <<<= 8
stosb // *edi ++ = al
jmp @Loop4 // }
@end:
pop eax // return eax
pop ebx
pop edi
pop esi
pop ebp
end;function Base64Decode(const Source: string; var Buf): Integer;
begin
Result := Base64_Decode(Source[1], Buf, Length(Source));
end;procedure Base64Decode(Source, Dest: TStream; StartPos: Int64; Size: Int64);
begin
Base64Stream(Source, Dest, Base64_Decode, StartPos, Size, 4096, 3072);
end;function Base64ToStr(Base64: string): string;
begin
SetLength(Result, Base64DecodeBufSize(Base64, Length(Base64)));
Base64_Decode(Base64[1], Result[1], Length(Base64));
end;end.
看红色的就行
var
Buffer:pchar;
begin
GetMem(Buffer,255);
StrCopy(Buffer,s1);
StrCat(Buffer, s2);
result:=Buffer;
end;把输入参数和返回值换成pchar试试
要么你用Delphi,也是很不错的产品
要么你就用微软的产品,