function getString(&$ar, $maxlen = 255, $firstRead = false, $encoding = 3)
{
$s = "";
$i = 0;
$rep = 1;
if ($encoding == 8) {
$rep = 2;
}
do {
$c = 0;
for($rc = 0; $rc < $rep; $rc ++) {
$c += ($firstRead && $i == 0) ? current($ar) : next($ar);
$i++;
}
if ($encoding == 8) {
if ($c >= 224 && $c <= 256) {
$c += 4080;
}
}
if ($c != 0) {
$s .= mb_chr($c);
}
} while ($i < $maxlen && $c != 0);
return $s;
}
$ar = unpack("C*", hex2bin('0001013939353539383235313533340000013930323237000000000000000008004a004800650079002010d010d110d210d310d410d510d610d710d810d910da10db10dc10dd10de10df10e010e110e210e310e410e510e610e710e810e910ea10eb10ec10ed10ee10ef10f00204000200a2'));
$service_type = getString($ar, 6, true); // 6
$source_addr_ton = next($ar); // 7
$source_addr_npi = next($ar); // 8
$source_addr = getString($ar, 21); // 29
$dest_addr_ton = next($ar); // 30
$dest_addr_npi = next($ar);
$destination_addr = getString($ar, 21); // 52
$esmClass = next($ar);
$protocolId = next($ar);
$priorityFlag = next($ar);
next($ar); // schedule_delivery_time
next($ar); // validity_period
$registeredDelivery = next($ar);
next($ar); // replace_if_present_flag
$dataCoding = next($ar); // 60
next($ar); // sm_default_msg_id
$sm_length = next($ar);
$message = getString($ar, $sm_length, false, $dataCoding);
var_dump('encoding: '.$dataCoding, 'length: ' . $sm_length, 'msg:' . $message);