2012-03-06 115 views
2

我有一个函数,它将我想要的超时信息字符串化为base64 url encode ,但是当我尝试解码编码的字符串时,它会返回与最初创建的字符串无关的垃圾。你如何在Perl中对Base64进行编码和解码连接字符串?

输出

[i] original string > 05cee990c62ca2ce5dfe6cd77115a96d|1331012040|1331004840|7200 
    [i] encoded string > MDVjZWU5OTBjNjJjYTJjZTVkZmU2Y2Q3NzExNWE5NmR8MTMzMTAxMjA0MHwxMzMxMDA0ODQwfDcyMDA= 
    [i] decoded string > Ó{ßts­kgå×ÞéÇ{ï]ykÞ 

悲哀的是同样的功能是能够解析来自Facebook检索base64url编码的信息。

功能

sub timeoutStringGen{ 
    my ($name,$seconds) = @_; 

    my $uuid = uniqueID(); #generates random string 
    my $timeStr = time(); 
    my $timeEnd = $timeStr + $seconds; 

    my $timeoutString = "$uuid|$timeEnd|$timeStr|$seconds"; 

    my $encodedString = encode_base64url($timeoutString); 
    my $decodedString = decode_base64url($timeoutString); 

    _info "original string > $timeoutString"; #interal log function outputs to STDERR 
    _info "encoded string > $encodedString"; 
    _info "decoded string > $decodedString"; 

    return $timeoutString; 
    } 


    sub timeoutStringParse{ 
    my ($timeoutString) = @_; 
    return 0 unless $timeoutString; 

    my ($uuid,$end,$start,$secs) = split /\Q|/,$timeoutString; 

    my $curr = time(); 
    my $left = $end - $curr; 

    my $isExpired = ($left > 0) ? 1 : 0; 

    my $timeHash = { 
     uuid => $uuid, 
     end => $end, 
     start => $start, 
     secs => $secs, 
     exp => $isExpired, 
     left => $left, 
     curr => $curr 
    }; 

    return $timeHash; 

    } 



but maybe you can help me understand why these dont work to encode and decode the string properly 

      #-------- 

      sub encode64{ 
      my($data) = @_; 
      return MIME::Base64::encode_base64($data); 
      } 

      #-------- 

      sub decode64{ 
      my($data) = @_; 
      return MIME::Base64::decode_base64($data); 
      } 

      #-------- 

      sub encode_base64url{ 
      my($data) = @_; 
      return 0 unless $data; 
      $data = encode64($data); 
      $data =~ tr#\-_#+/#; 
      return($data); 
      } 

      #-------- 

      sub decode_base64url{ 
      my($data) = @_; 
      return 0 unless $data; 
      $data =~ tr#+/#\-_#; 
      $data = decode64($data); 
      return($data); 
      } 

回答

4

此:

my $decodedString = decode_base64url($timeoutString); 

应该是:

my $decodedString = decode_base64url($encodedString); 
             ^^^^^^^^^^^^^^ 

书面你原来值解码,编码的一个。

+0

DOH!这正是问题所在。 *打额头*无论如何谢谢! – qodeninja 2012-03-06 03:39:46

+3

它发生在我们所有人身上。走出去,得到下一个错误! – bernie 2012-03-06 03:41:25