/**
  * @param Parser $parser
  * @return PrivateKey
  */
 public function fromParser(Parser &$parser)
 {
     $bytes = $parser->readBytes(32);
     $multiplier = $bytes->getInt();
     $privateKey = PrivateKeyFactory::fromInt($multiplier, false, $this->ecAdapter);
     return $privateKey;
 }
 /**
  * @param Parser $parser
  * @return Buffer
  * @throws \BitWasp\Buffertools\Exceptions\ParserOutOfRange
  */
 public function read(Parser &$parser)
 {
     $bits = $this->readBits($parser->readBytes($this->length));
     if (!$this->isBigEndian()) {
         $bits = $this->flipBits($bits);
     }
     return Buffer::hex(str_pad($this->getMath()->baseConvert($bits, 2, 16), $this->length * 2, '0', STR_PAD_LEFT), $this->length, $this->getMath());
 }
 /**
  * @param Parser $parser
  * @return int|string
  * @throws \BitWasp\Buffertools\Exceptions\ParserOutOfRange
  * @throws \Exception
  */
 public function readBits(Parser &$parser)
 {
     $math = $this->getMath();
     $bitSize = $this->getBitSize();
     $bits = str_pad($math->baseConvert($parser->readBytes($bitSize / 8)->getHex(), 16, 2), $bitSize, '0', STR_PAD_LEFT);
     $integer = $math->baseConvert($this->isBigEndian() ? $bits : $this->flipBits($bits), 2, 10);
     return $integer;
 }
 /**
  * @param Parser $parser
  * @return Ipv4|Ipv6|Onion
  * @throws \BitWasp\Buffertools\Exceptions\ParserOutOfRange
  * @throws \Exception
  */
 public function fromParser(Parser $parser)
 {
     $buffer = $parser->readBytes(16);
     $binary = $buffer->getBinary();
     if (Onion::MAGIC === substr($binary, 0, strlen(Onion::MAGIC))) {
         $addr = strtolower(Base32::encode($buffer->slice(strlen(Onion::MAGIC))->getBinary())) . '.onion';
         $ip = new Onion($addr);
     } elseif (Ipv4::MAGIC === substr($binary, 0, strlen(Ipv4::MAGIC))) {
         $end = $buffer->slice(strlen(Ipv4::MAGIC), 4);
         $ip = new Ipv4(long2ip($end->getInt()));
     } else {
         $addr = [];
         foreach (str_split($binary, 2) as $segment) {
             $addr[] = bin2hex($segment);
         }
         $addr = implode(":", $addr);
         $ip = new Ipv6($addr);
     }
     return $ip;
 }
 /**
  * @param Parser $parser
  * @return PrivateKey
  * @throws \BitWasp\Buffertools\Exceptions\ParserOutOfRange
  */
 public function fromParser(Parser $parser)
 {
     $compressed = $this->haveNextCompressed;
     $this->haveNextCompressed = false;
     return $this->ecAdapter->getPrivateKey($parser->readBytes(32)->getInt(), $compressed);
 }
<?php

require "../vendor/autoload.php";
use BitWasp\Buffertools\Buffer;
use BitWasp\Buffertools\Parser;
// Parsers read Buffers
$buffer = new Buffer('abc');
$parser = new Parser($buffer);
// Call readBytes to unpack the data
/** @var Buffer[] $set */
$set = [$parser->readBytes(1), $parser->readBytes(1), $parser->readBytes(1)];
foreach ($set as $item) {
    echo $item->getBinary() . PHP_EOL;
}
 /**
  * @expectedException \Exception
  */
 public function testReadBytesBeyondLength()
 {
     $bytes = '41424344';
     $parser = new Parser($bytes);
     $parser->readBytes(5);
 }