2013-06-12 5 views
0

이있는 Crockford base32 문자열을 디코딩하십시오. 그래서이 문제를 해결하기 위해 노력하고 있습니다. 나는 Crockfords base32 알고리즘으로 인코딩 된 문자열과 ISO-7064 Mod 37, 36을 기반으로하는 체크섬을 PHP에서 디코딩해야합니다.ISO-7064 Mod 37, 36-checksum

문자열은 "66QC"이고 체크섬은 "203500"으로 디코드되어야하는 "Q"입니다. 문자열을 디코딩하기 위해 this class을 사용했지만 체크섬에 관해서는 여전히 손실 상태입니다. 이 예제를 발견하고 잃어버린 느낌이 든다. 누군가가 비슷한 것을했거나 올바른 방향을 가르키면 큰 감사를 표한다.

답변

1

VisualBasic에서 작동 예제를 발견하고 PHP로 변환했다. 관심있는 사람 :

class ISO7064Decoder 
{ 
    public static $iso7064 = array(
    '0' => 0, 
    '1' => 1, 
    '2' => 2, 
    '3' => 3, 
    '4' => 4, 
    '5' => 5, 
    '6' => 6, 
    '7' => 7, 
    '8' => 8, 
    '9' => 9, 
    'A' => 10, 
    'B' => 11, 
    'C' => 12, 
    'D' => 13, 
    'E' => 14, 
    'F' => 15, 
    'G' => 16, 
    'H' => 17, 
    'I' => 18, 
    'J' => 19, 
    'K' => 20, 
    'L' => 21, 
    'M' => 22, 
    'N' => 23, 
    'O' => 24, 
    'P' => 25, 
    'Q' => 26, 
    'R' => 27, 
    'S' => 28, 
    'T' => 29, 
    'U' => 30, 
    'V' => 31, 
    'W' => 32, 
    'X' => 33, 
    'Y' => 34, 
    'Z' => 35 
); 

public static function calculateCheckDigit(String $value) 
{ 
    $lngCheck = 36; 
    $lngLen = strlen($value); 

    for($lng = 0; $lng <= strlen($value)-1; $lng++) 
    {   
     $lngCheck = $lngCheck + self::charToNumber(substr($value, $lng, 1)); 

     if($lngCheck > 36) 
     { 
      $lngCheck = $lngCheck - 36; 
     } 
     $lngCheck = $lngCheck * 2; 
     if($lngCheck >= 37) 
     { 
      $lngCheck = $lngCheck - 37; 
     } 
    } 
    $lngCheck = 37 - $lngCheck; 
    if($lngCheck == 36) 
    { 
     $lngCheck = 0; 
    } 

    return $lngCheck; 
} 

public static function charToNumber($value) 
{ 
    $value = strtoupper($value); 

    if(!array_key_exists($value, static::$iso7064)) 
    { 
     return -1; 
    } 
    else 
    { 
     return static::$iso7064[$value]; 
    } 
} 
}