/** * @param string $binary * @param bool $internal * @param int &$offset * * @return EncapsulatedPacket */ public static function fromBinary($binary, $internal = false, &$offset = null) { $packet = new EncapsulatedPacket(); $flags = ord($binary[0]); $packet->reliability = $reliability = ($flags & 0b11100000) >> 5; $packet->hasSplit = $hasSplit = ($flags & 0b10000) > 0; if ($internal) { $length = Binary::readInt(substr($binary, 1, 4)); $packet->identifierACK = Binary::readInt(substr($binary, 5, 4)); $offset = 9; } else { $length = (int) ceil(Binary::readShort(substr($binary, 1, 2)) / 8); $offset = 3; $packet->identifierACK = null; } /* * From http://www.jenkinssoftware.com/raknet/manual/reliabilitytypes.html * * Default: 0b010 (2) or 0b011 (3) * * 0: UNRELIABLE * 1: UNRELIABLE_SEQUENCED * 2: RELIABLE * 3: RELIABLE_ORDERED * 4: RELIABLE_SEQUENCED * 5: UNRELIABLE_WITH_ACK_RECEIPT * 6: RELIABLE_WITH_ACK_RECEIPT * 7: RELIABLE_ORDERED_WITH_ACK_RECEIPT */ if ($reliability === 2 or $reliability === 3 or $reliability === 4 or $reliability === 6 or $reliability === 7) { $packet->messageIndex = Binary::readLTriad(substr($binary, $offset, 3)); $offset += 3; } else { $packet->messageIndex = null; } if ($reliability === 1 or $reliability === 3 or $reliability === 4 or $reliability === 7) { $packet->orderIndex = Binary::readLTriad(substr($binary, $offset, 3)); $offset += 3; $packet->orderChannel = ord($binary[$offset++]); } else { $packet->orderIndex = null; $packet->orderChannel = null; } if ($hasSplit) { $packet->splitCount = Binary::readInt(substr($binary, $offset, 4)); $offset += 4; $packet->splitID = Binary::readShort(substr($binary, $offset, 2)); $offset += 2; $packet->splitIndex = Binary::readInt(substr($binary, $offset, 4)); $offset += 4; } else { $packet->splitCount = null; $packet->splitID = null; $packet->splitIndex = null; } $packet->buffer = substr($binary, $offset, $length); $offset += $length; return $packet; }
/** * @param string $binary * @param bool $internal * @param int &$offset * * @return EncapsulatedPacket */ public static function fromBinary($binary, $internal = false, &$offset = null) { $packet = new EncapsulatedPacket(); $flags = ord($binary[0]); $packet->reliability = $reliability = ($flags & 0b11100000) >> 5; $packet->hasSplit = $hasSplit = ($flags & 0b10000) > 0; if ($internal) { $length = Binary::readInt(substr($binary, 1, 4)); $packet->identifierACK = Binary::readInt(substr($binary, 5, 4)); $offset = 9; } else { $length = (int) ceil(Binary::readShort(substr($binary, 1, 2)) / 8); $offset = 3; $packet->identifierACK = null; } if ($reliability > PacketReliability::UNRELIABLE) { if ($reliability >= PacketReliability::RELIABLE and $reliability !== PacketReliability::UNRELIABLE_WITH_ACK_RECEIPT) { $packet->messageIndex = Binary::readLTriad(substr($binary, $offset, 3)); $offset += 3; } if ($reliability <= PacketReliability::RELIABLE_SEQUENCED and $reliability !== PacketReliability::RELIABLE) { $packet->orderIndex = Binary::readLTriad(substr($binary, $offset, 3)); $offset += 3; $packet->orderChannel = ord($binary[$offset++]); } } if ($hasSplit) { $packet->splitCount = Binary::readInt(substr($binary, $offset, 4)); $offset += 4; $packet->splitID = Binary::readShort(substr($binary, $offset, 2)); $offset += 2; $packet->splitIndex = Binary::readInt(substr($binary, $offset, 4)); $offset += 4; } $packet->buffer = substr($binary, $offset, $length); $offset += $length; return $packet; }
protected function getLTriad() { return Binary::readLTriad($this->get(3)); }