Created
June 2, 2011 11:48
-
-
Save Pozo/1004284 to your computer and use it in GitHub Desktop.
IBM key punch 029 decoder
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* IBM key punch 029 decoder | |
* http://en.wikipedia.org/wiki/Punched_card | |
* | |
* control characters not implemented but you can do it from this link | |
* | |
* http://www.cs.uiowa.edu/~jones/cards/codes.html | |
* | |
* @param string binary chain represent EBCDIC character set | |
* @param bloolean change interpretation reading mode, true means a 960 character matrix, false equals a simple sequential decoding | |
* | |
* bit positions | |
* | |
* param2 = true param2 = false | |
* _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
* /0 1 2 3 4 5 6 7 8 | /0 5 | | |
* | 9 10 . . | | 1 6 | | |
* | | | 2 . | | |
* | | | 3 . | | |
* |_ _ _ _ _ _ _ _ _ _ | |_4 _ _ _ _ _ _ _ _ _| | |
* | |
*/ | |
function ibm029decode($string,$switch) { | |
define('CARD_LENGTH',80); | |
define('CARD_HEIGHT',12); | |
$t = ''; | |
if($switch) { | |
$ebcdic = str_split($string, CARD_LENGTH); | |
$arr_len = count($ebcdic); | |
for($i=0;$i<CARD_LENGTH;$i++) { | |
${'temp'."$i"} = ''; | |
for($n=0;$n<=$arr_len;$n++) { | |
${'temp'."$i"} .= $ebcdic[$n][$i]; | |
} | |
} | |
} else { | |
$ebcdic = str_split($string, CARD_HEIGHT); | |
for($i=0;$i<CARD_LENGTH;$i++) { | |
${'temp'."$i"} .= $ebcdic[$i]; | |
} | |
} | |
for($i=0;$i<CARD_LENGTH;$i++) { | |
switch(${'temp'."$i"}) { | |
// numbers | |
// 0123456789 | |
case '001000000000': $t .='0';break; | |
case '000100000000': $t .='1';break; | |
case '000010000000': $t .='2';break; | |
case '000001000000': $t .='3';break; | |
case '000000100000': $t .='4';break; | |
case '000000010000': $t .='5';break; | |
case '000000001000': $t .='6';break; | |
case '000000000100': $t .='7';break; | |
case '000000000010': $t .='8';break; | |
case '000000000001': $t .='9';break; | |
// lowercase chars | |
// 0123456789 | |
case '101100000000': $t .='a';break; | |
case '101010000000': $t .='b';break; | |
case '101001000000': $t .='c';break; | |
case '101000100000': $t .='d';break; | |
case '101000010000': $t .='e';break; | |
case '101000001000': $t .='f';break; | |
case '101000000100': $t .='g';break; | |
case '101000000010': $t .='h';break; | |
case '101000000001': $t .='i';break; | |
case '110100000000': $t .='j';break; | |
case '110010000000': $t .='k';break; | |
case '110001000000': $t .='l';break; | |
case '110000100000': $t .='m';break; | |
case '110000010000': $t .='n';break; | |
case '110000001000': $t .='o';break; | |
case '110000000100': $t .='p';break; | |
case '110000000010': $t .='q';break; | |
case '110000000001': $t .='r';break; | |
case '011010000000': $t .='s';break; | |
case '011001000000': $t .='t';break; | |
case '011000100000': $t .='u';break; | |
case '011000010000': $t .='v';break; | |
case '011000001000': $t .='w';break; | |
case '011000000100': $t .='x';break; | |
case '011000000010': $t .='y';break; | |
case '011000000001': $t .='z';break; | |
// uppercase chars | |
// 0123456789 | |
case '100100000000': $t .='A';break; | |
case '100010000000': $t .='B';break; | |
case '100001000000': $t .='C';break; | |
case '100000100000': $t .='D';break; | |
case '100000010000': $t .='E';break; | |
case '100000001000': $t .='F';break; | |
case '100000000100': $t .='G';break; | |
case '100000000010': $t .='H';break; | |
case '100000000001': $t .='I';break; | |
case '010100000000': $t .='J';break; | |
case '010010000000': $t .='K';break; | |
case '010001000000': $t .='L';break; | |
case '010000100000': $t .='M';break; | |
case '010000010000': $t .='N';break; | |
case '010000001000': $t .='O';break; | |
case '010000000100': $t .='P';break; | |
case '010000000010': $t .='Q';break; | |
case '010000000001': $t .='R';break; | |
case '001010000000': $t .='S';break; | |
case '001001000000': $t .='T';break; | |
case '001000100000': $t .='U';break; | |
case '001000010000': $t .='V';break; | |
case '001000001000': $t .='W';break; | |
case '001000000100': $t .='X';break; | |
case '001000000010': $t .='Y';break; | |
case '001000000001': $t .='Z';break; | |
// special | |
// 0123456789 | |
case '100010000010': $t .='c';break; | |
case '100001000010': $t .='.';break; | |
case '100000100010': $t .='<';break; | |
case '100000010010': $t .='(';break; | |
case '100000001010': $t .='+';break; | |
case '100000000110': $t .='|';break; | |
case '010010000010': $t .='!';break; | |
case '010001000010': $t .='$';break; | |
case '010000100010': $t .='*';break; | |
case '010000010010': $t .=')';break; | |
case '010000001010': $t .=';';break; | |
case '010000000110': $t .='¬';break; | |
case '001010000010': $t .=' ';break; | |
case '001001000010': $t .=',';break; | |
case '001000100010': $t .='%';break; | |
case '001000010010': $t .='_';break; | |
case '001000001010': $t .='>';break; | |
case '001000000110': $t .='?';break; | |
case '000010000010': $t .=':';break; | |
case '000001000010': $t .='#';break; | |
case '000000100010': $t .='@';break; | |
case '000000010010': $t .='\'';break; | |
case '000000001010': $t .='=';break; | |
case '000000000110': $t .='"';break; | |
case '000001000010': $t .='#';break; | |
// exceptions | |
// 0123456789 | |
case '010000000000': $t .='-';break; | |
case '100000000000': $t .='&';break; | |
case '001100000000': $t .='/';break; | |
} | |
if($i>0){ | |
unset(${'temp'.($i-1)}); | |
} | |
} | |
unset(${'temp'.(CARD_LENGTH-1)}); | |
return $t; | |
} | |
$hello = '100000000010101000010000110001000000110001000000110000001000001010000010011000001000110000001000110000000001110001000000101000100000010010000010'; | |
$hello_matrix = | |
'11111001111000000000000000000000000000000000000000000000000000000000000000000000'. | |
'00111011110100000000000000000000000000000000000000000000000000000000000000000000'. | |
'01000110001000000000000000000000000000000000000000000000000000000000000000000000'. | |
'00000000000000000000000000000000000000000000000000000000000000000000000000000000'. | |
'00000100000100000000000000000000000000000000000000000000000000000000000000000000'. | |
'00110000010000000000000000000000000000000000000000000000000000000000000000000000'. | |
'00000000001000000000000000000000000000000000000000000000000000000000000000000000'. | |
'01000000000000000000000000000000000000000000000000000000000000000000000000000000'. | |
'00001011000000000000000000000000000000000000000000000000000000000000000000000000'. | |
'00000000000000000000000000000000000000000000000000000000000000000000000000000000'. | |
'10000100000100000000000000000000000000000000000000000000000000000000000000000000'. | |
'00000000100000000000000000000000000000000000000000000000000000000000000000000000'; | |
echo ibm029decode($hello,false),'<br />'; | |
echo ibm029decode($hello_matrix,true); | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment