public static function decDocument($data, &$offset) { $docLen = Util::unpack('Vlen', $data, $offset, 4)['len'] - 5; // subtract len. and null-terminator $document = []; $parsedLen = 0; while (0 !== ord($data[$offset])) { $elmLen = $offset; $elm = self::decElement($data, $offset); $parsedLen += $offset - $elmLen; $document[$elm[0]] = $elm[1]; } if ($docLen !== $parsedLen) { throw new \RuntimeException(sprintf('Document length doesn\'t match total size of parsed elements (%d:%d)', $docLen, $parsedLen)); } $offset++; // add one byte for document nul-terminator return $document; }