Y64 Help needed Porting.

I'm trying to port a Y64/Yahoo64 routine to Delphi problem is I'm having difficulty understanding the code I'm porting, I have several sources of this Y64 but none in Pascal/Delphi.

It's apparently similar to Mac64 which produces a similar string but it's 2 bytes longer.

If i can work out

                  $dest.=$yahoo64[ord($source[$in])>>2];                   
            $dest.=$yahoo64[((ord($source[$in])<<4)&0x30) | (ord($source[$in+1])>>4)];
            $dest.=$yahoo64[((ord($source[$in+1])<<2)&0x3C) | (ord($source[$in+2])>>6)];
            $dest.=$yahoo64[ord($source[$in+2])&0x3F];
            $in += 3;

How to covert that to Pascal I can finish the rest myself . or if anyone knows where y64 exists already in pascal save me a huge headache.

Thanks..
function y64($source)
{  $yahoo64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._"; 
	// something with 16 bytes not hex
	$inlen = 16;
	$in=0;
	// in este ce primim
	for(; $inlen >=3; $inlen -=3)
	{
			$dest.=$yahoo64[ord($source[$in])>>2]; 			
		$dest.=$yahoo64[((ord($source[$in])<<4)&0x30) | (ord($source[$in+1])>>4)]; 
		$dest.=$yahoo64[((ord($source[$in+1])<<2)&0x3C) | (ord($source[$in+2])>>6)]; 
		$dest.=$yahoo64[ord($source[$in+2])&0x3F]; 
		$in += 3;
	}	
	if($inlen>0)
	{
		// enters here :)
		$dest.=$yahoo64[ord($source[$in])>>2]; 
		$fragment = ((ord($source[$in])<<4)&0x30);
		if($inlen>1){$fragment |= (ord($source[$in+1])>>4);			}
		$dest.=$yahoo64[$fragment];
		if($inlen<2)
			{$dest.="-";}
		else
			{$dest.=$yahoo64[((ord($source[$in+1])<<2)&0x3c)]; }
		$dest.="-";
		
	}	
        
	
	return $dest;
}
 
or this routine...
 
function y64($source)
{ $yahoo64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._";
// something with 16 bytes not hex
$inlen = 16;
$in=0;
// in este ce primim
for(; $inlen >=3; $inlen -=3)
{
$dest.=$yahoo64[ord($source[$in])>>2];
$dest.=$yahoo64[((ord($source[$in])<<4)&0x30) | (ord($source[$in+1])>>4)];
$dest.=$yahoo64[((ord($source[$in+1])<<2)&0x3C) | (ord($source[$in+2])>>6)];
$dest.=$yahoo64[ord($source[$in+2])&0x3F];
$in += 3;
}
if($inlen>0)
{
// enters here :)
$dest.=$yahoo64[ord($source[$in])>>2];
$fragment = ((ord($source[$in])<<4)&0x30);
if($inlen>1){$fragment |= (ord($source[$in+1])>>4); }
$dest.=$yahoo64[$fragment];
if($inlen<2)
{$dest.="-";}
else
{$dest.=$yahoo64[((ord($source[$in+1])<<2)&0x3c)]; }
$dest.="-";
 
}

Open in new window

LVL 4
tobjectpascalAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

tobjectpascalAuthor Commented:
Here's the C# version..

Might be easier to understand.

public static string to_y64(byte[] input) {
 
 /* raw bytes in quasi-big-endian order to base 64 string (NUL-terminated) */
 
 const string base64digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._";
 
 int inlen=input.Length;
 char[] temp = new char[24];
 int i=0,j=0;
 
 for (;inlen >= 3;inlen -= 3) {
  temp[i++] = base64digits[input[j] >> 2];
  temp[i++] = base64digits[((input[j] << 4) & 0x30) | (input[j+1] >> 4)];
  temp[i++] = base64digits[((input[j+1] << 2) & 0x3c) | (input[j+2] >> 6)];
  temp[i++] = base64digits[input[j+2] & 0x3f];
  j += 3;
 }
 
 if (inlen > 0) {
  int fragment;
  temp[i++] = base64digits[input[j] >> 2];
  fragment = (input[j] << 4) & 0x30;
  if (inlen > 1)
   fragment |= input[j+1] >> 4;
  temp[i++] = base64digits[fragment];
  temp[i++] = (inlen < 2) ? '-' : base64digits[(input[j+1] << 2) & 0x3c];
  temp[i++] = '-';
 }
 return GetString(temp);
}

Open in new window

0
tobjectpascalAuthor Commented:
yet another example.

static unsigned yahoobase64 (unsigned char *src, unsigned srclen, char *dst) {
	static const char *enc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
		"abcdefghijklmnopqrstuvwxyz0123456789._";
	unsigned char *end = src + srclen;
	char *pdst = dst;
	unsigned x;
	for ( ; src < end; pdst += 4) 
		if (end - src >= 3) {
			x = (src [0] << 16) + (src [1] << 8) + src [2];
			pdst [3] = enc [x & 0x3f]; x >>= 6;
			pdst [2] = enc [x & 0x3f]; x >>= 6;
			pdst [1] = enc [x & 0x3f]; x >>= 6;
			pdst [0] = enc [x & 0x3f];
			src += 3;
			continue;
		}
		else if (end - src == 2) {
			x = (src [0] << 16) + (src [1] << 8);
			pdst [3] = '-'; x >>= 6;
			pdst [2] = enc [x & 0x3f]; x >>= 6;
			pdst [1] = enc [x & 0x3f]; x >>= 6;
			pdst [0] = enc [x & 0x3f];
			src += 2;
			continue;
		}
		else if (end - src == 1) {
			x = src [0] << 16;
			pdst [3] = '-'; x >>= 6;
			pdst [2] = '-'; x >>= 6;
			pdst [1] = enc [x & 0x3f]; x >>= 6;
			pdst [0] = enc [x & 0x3f];
			src += 1;
			continue;
		}
	*pdst = '\0';
	return pdst - dst;
}

Open in new window

0
tobjectpascalAuthor Commented:
It's C code lol
0
C++ 11 Fundamentals

This course will introduce you to C++ 11 and teach you about syntax fundamentals.

Dagan HooverDeveloperCommented:
This should work although I can't do any debugging because I don't know what should be inputted and how it comes out. If this doesn't work the way it's supposed to give me a Input and what it should Output.
function YahooBase64(Source: PChar; SourceLen: DWORD): PChar;
const
  Enc : PChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._';
var
  pEnd : PChar;
  pDst : PChar;
  X : DWORD;
begin
  pEnd := Source + SourceLen;
  Result := AllocMem(24);
  pDst := Result;
  X := 0;
  While Source < pEnd Do
    begin
    If (pEnd - Source) >= 3 Then
      begin
      X := (Byte(Source[0]) SHL 16) + (Byte(Source[1]) SHL 8) + Byte(Source[2]);
      pDst[3] := Enc[X AND $3F];
      X := X SHR 6;
      pDst[2] := Enc[X AND $3F];
      X := X SHR 6;
      pDst[1] := Enc[X AND $3F];
      X := X SHR 6;
      pDst[0] := Enc[X AND $3F];
      Inc(Source,3);
      Continue;
    end
    Else If (pEnd - Source) = 2 Then
      begin
      X := (Byte(Source[0]) SHL 16) + (Byte(Source[1]) SHL 8);
      pDst[3] := '-';
      X := X SHR 6;
      pDst[2] := Enc[X AND $3F];
      X := X SHR 6;
      pDst[1] := Enc[X AND $3F];
      X := X SHR 6;
      pDst[0] := Enc[X AND $3F];
      Inc(Source,2);
      Continue;
    end
    Else If (pEnd - Source) = 1 Then
      begin
      X := Byte(Source[0]) SHL 16;
      pDst[3] := '-';
      X := X SHR 6;
      pDst[2] := '-';
      X := X SHR 6;
      pDst[1] := Enc[X AND $3F];
      X := X SHR 6;
      pDst[0] := Enc[X AND $3F];
      Inc(Source);
      Continue;
    end;
    Inc(pDst,4);
  end;
  pDst^ := #0;
  Dec(Source,SourceLen);
end;

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
tobjectpascalAuthor Commented:
wow thanks, you can have the points just for the effort I was hoping for a couple of lines of code but wow thank you :)

points are yours just for trying......
0
tobjectpascalAuthor Commented:
10/10 for effort thanks :)
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Delphi

From novice to tech pro — start learning today.