<?php
require 'zbase32.php';
/**
* Random string generator
*
* Used to generate random plaintext strings for testing encoding methods
* @author CPKS
* @version 1.0
* @package testing
* @license Public domain
*/
class random_string_generator {
/**
* @var string random string data
*/
private $data;
/**
* @var int length of random string data
*/
private $datalen;
/**
* @param int $length length of random string data from which samples will be culled
* @param int $bits Number of character bits in data, must be 4 <= $bits <= 8
*/
public function __construct($length, $bits) {
if ($bits < 4)
throw new InvalidArgumentException('Minimum bits = 4');
if ($bits > 8)
throw new InvalidArgumentException('Maximum bits = 8');
$bitmax = array(1, 2, 4, 8, 16, 32, 64, 128, 256);
$bitmax = $bitmax[$bits] - 1; // get max char code value for string
for ($i = 0; $i < $length; ++$i) $d[] = chr(rand(1, $bitmax));
$this->data = implode('', $d);
$this->datalen = $length;
}
/**
* @param int $length number of bytes of random string required for a test
* @return string a random string of the specified length
*/
public function __invoke($length) {
if ($length > $this->datalen)
throw new BadMethodCallException("Requested length exceeds $this->datalen");
$maxoffset = $this->datalen - $length;
$start = rand(0, $maxoffset);
return substr($this->data, $start, $length);
}
}
// Test encoding on random input strings
$rs = new random_string_generator(40, 7);
$errs = 0;
for ($i = 20; $i > 2; --$i) {
$r = $rs($i);
$e = zbase32::encode($r);
if ($r !== zbase32::decode($e)) {
echo "Encode/decode failed on length $i.\n";
++$errs;
}
}
if ($errs)
echo "$errs errors.\n";
else echo "Looks good!\n";
|