2013-06-12 53 views
0

所以我一直在試圖圍繞這個來包裹我的頭。我有一個用Crockfords base32算法編碼的字符串,以及基於ISO-7064 Mod 37,36的校驗和,需要用PHP解碼。使用ISO-7064解碼Crockford base32-string 37,36-checksum

字符串是「66QC」,校驗和是「Q」,應該解碼爲「203500」。我用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]; 
    } 
} 
}