protected static function unpackPayload(Record $self, $data)
{
$currentOffset = 0;
do {
list($nameLengthHigh) = array_values(unpack('CnameLengthHigh', $data));
$isLongName = $nameLengthHigh >> 7 == 1;
$valueOffset = $isLongName ? 4 : 1;
list($valueLengthHigh) = array_values(unpack('CvalueLengthHigh', substr($data, $valueOffset)));
$isLongValue = $valueLengthHigh >> 7 == 1;
$dataOffset = $valueOffset + ($isLongValue ? 4 : 1);
$formatParts = array($isLongName ? 'NnameLength' : 'CnameLength', $isLongValue ? 'NvalueLength' : 'CvalueLength');
$format = join('/', $formatParts);
list($nameLength, $valueLength) = array_values(unpack($format, $data));
// Clear top bit for long record
$nameLength &= $isLongName ? 0x7fffffff : 0x7f;
$valueLength &= $isLongValue ? 0x7fffffff : 0x7f;
list($nameData, $valueData) = array_values(unpack("a{$nameLength}nameData/a{$valueLength}valueData", substr($data, $dataOffset)));
$self->values[$nameData] = $valueData;
$keyValueLength = $dataOffset + $nameLength + $valueLength;
$data = substr($data, $keyValueLength);
$currentOffset += $keyValueLength;
} while ($currentOffset < $self->getContentLength());
return $self;
}