I've been trying to get a relatively optimized version of base64 encoding that works against files. However, I've made several attempts and haven't gotten anything much faster than what I have here. On the posted implementation, I started from what was posted on http://www.swissdelphicenter.ch/torry/showcode.php?id=1524 . I have to think there's a way to do it without tossing values around in a, so I tried that by processing three bytes at a time and then processing the rest, but I didn't end up with anything faster. So, does anyone have any ideas on how to improve it any more from a speed perspective?
(Relevant code below, I slid some global definitions into the first procedure so people could see those. Codes64 is the string I'm using to encode the data with, not reproduced here for brevity)
procedure TMyMimeEncoder.Enc64Buffer(inbuf, outbuf: pointer; inbufsize: longint; var outbufsize: longint); // run on the buffer read in by the file (inbuf). Outbuf is the output. type PByteArray1 = ^TByteArray1; TByteArray1 = array[1..buffersize] of Byte; var a, b: longint; inproc: PByteArray1 absolute inbuf; outproc: PChar; i: longint; begin outproc := outbuf; outbufsize := 0; for i := 1 to inbufsize do begin b := (b shl 8) + inproc^[i]; a := a + 8; if a = 12 then begin a := a - 6; outproc^ := Codes64[(b shr a)]; b := b and ((1 shl a) - 1); inc(outproc, 1); inc(outbufsize, 1); end; a := a - 6; outproc^ := Codes64[(b shr a)]; b := b and ((1 shl a) - 1); inc(outproc, 1); inc(outbufsize, 1); end; end; function TMyMimeEncoder.Enc64Final: String; // run at the end of file to finish the encoding. begin Result := ''; if a = 4 then Result := Codes64[(b shl 2) + 1] + '=' else if a = 2 then Result := Codes64[(b shl 4) + 1] + '=='; end;