| <?php |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| namespace PHPQRCode; |
|
|
| class QRbitstream { |
|
|
| public $data = array(); |
|
|
| |
| public function size() |
| { |
| return count($this->data); |
| } |
|
|
| |
| public function allocate($setLength) |
| { |
| $this->data = array_fill(0, $setLength, 0); |
| return 0; |
| } |
|
|
| |
| public static function newFromNum($bits, $num) |
| { |
| $bstream = new QRbitstream(); |
| $bstream->allocate($bits); |
|
|
| $mask = 1 << ($bits - 1); |
| for($i=0; $i<$bits; $i++) { |
| if($num & $mask) { |
| $bstream->data[$i] = 1; |
| } else { |
| $bstream->data[$i] = 0; |
| } |
| $mask = $mask >> 1; |
| } |
|
|
| return $bstream; |
| } |
|
|
| |
| public static function newFromBytes($size, $data) |
| { |
| $bstream = new QRbitstream(); |
| $bstream->allocate($size * 8); |
| $p=0; |
|
|
| for($i=0; $i<$size; $i++) { |
| $mask = 0x80; |
| for($j=0; $j<8; $j++) { |
| if($data[$i] & $mask) { |
| $bstream->data[$p] = 1; |
| } else { |
| $bstream->data[$p] = 0; |
| } |
| $p++; |
| $mask = $mask >> 1; |
| } |
| } |
|
|
| return $bstream; |
| } |
|
|
| |
| public function append(QRbitstream $arg) |
| { |
| if (is_null($arg)) { |
| return -1; |
| } |
|
|
| if($arg->size() == 0) { |
| return 0; |
| } |
|
|
| if($this->size() == 0) { |
| $this->data = $arg->data; |
| return 0; |
| } |
|
|
| $this->data = array_values(array_merge($this->data, $arg->data)); |
|
|
| return 0; |
| } |
|
|
| |
| public function appendNum($bits, $num) |
| { |
| if ($bits == 0) |
| return 0; |
|
|
| $b = QRbitstream::newFromNum($bits, $num); |
|
|
| if(is_null($b)) |
| return -1; |
|
|
| $ret = $this->append($b); |
| unset($b); |
|
|
| return $ret; |
| } |
|
|
| |
| public function appendBytes($size, $data) |
| { |
| if ($size == 0) |
| return 0; |
|
|
| $b = QRbitstream::newFromBytes($size, $data); |
|
|
| if(is_null($b)) |
| return -1; |
|
|
| $ret = $this->append($b); |
| unset($b); |
|
|
| return $ret; |
| } |
|
|
| |
| public function toByte() |
| { |
|
|
| $size = $this->size(); |
|
|
| if($size == 0) { |
| return array(); |
| } |
|
|
| $data = array_fill(0, (int)(($size + 7) / 8), 0); |
| $bytes = (int)($size / 8); |
|
|
| $p = 0; |
|
|
| for($i=0; $i<$bytes; $i++) { |
| $v = 0; |
| for($j=0; $j<8; $j++) { |
| $v = $v << 1; |
| $v |= $this->data[$p]; |
| $p++; |
| } |
| $data[$i] = $v; |
| } |
|
|
| if($size & 7) { |
| $v = 0; |
| for($j=0; $j<($size & 7); $j++) { |
| $v = $v << 1; |
| $v |= $this->data[$p]; |
| $p++; |
| } |
| $data[$bytes] = $v; |
| } |
|
|
| return $data; |
| } |
|
|
| } |