Skip to content

Instantly share code, notes, and snippets.

@Pozo
Created June 2, 2011 11:48
Show Gist options
  • Save Pozo/1004284 to your computer and use it in GitHub Desktop.
Save Pozo/1004284 to your computer and use it in GitHub Desktop.
IBM key punch 029 decoder
<?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