qrbitstream.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. <?php
  2. class QRbitstream
  3. {
  4. public $data = array();
  5. public function size()
  6. {
  7. return count($this->data);
  8. }
  9. public function allocate($setLength)
  10. {
  11. $this->data = array_fill(0, $setLength, 0);
  12. return 0;
  13. }
  14. static public function newFromNum($bits, $num)
  15. {
  16. $bstream = new QRbitstream();
  17. $bstream->allocate($bits);
  18. $mask = 1 << $bits - 1;
  19. for ($i = 0; $i < $bits; $i++) {
  20. if ($num & $mask) {
  21. $bstream->data[$i] = 1;
  22. }
  23. else {
  24. $bstream->data[$i] = 0;
  25. }
  26. $mask = $mask >> 1;
  27. }
  28. return $bstream;
  29. }
  30. static public function newFromBytes($size, $data)
  31. {
  32. $bstream = new QRbitstream();
  33. $bstream->allocate($size * 8);
  34. $p = 0;
  35. for ($i = 0; $i < $size; $i++) {
  36. $mask = 128;
  37. for ($j = 0; $j < 8; $j++) {
  38. if ($data[$i] & $mask) {
  39. $bstream->data[$p] = 1;
  40. }
  41. else {
  42. $bstream->data[$p] = 0;
  43. }
  44. $p++;
  45. $mask = $mask >> 1;
  46. }
  47. }
  48. return $bstream;
  49. }
  50. public function append(QRbitstream $arg)
  51. {
  52. if (is_null($arg)) {
  53. return -1;
  54. }
  55. if ($arg->size() == 0) {
  56. return 0;
  57. }
  58. if ($this->size() == 0) {
  59. $this->data = $arg->data;
  60. return 0;
  61. }
  62. $this->data = array_values(array_merge($this->data, $arg->data));
  63. return 0;
  64. }
  65. public function appendNum($bits, $num)
  66. {
  67. if ($bits == 0) {
  68. return 0;
  69. }
  70. $b = QRbitstream::newFromNum($bits, $num);
  71. if (is_null($b)) {
  72. return -1;
  73. }
  74. $ret = $this->append($b);
  75. unset($b);
  76. return $ret;
  77. }
  78. public function appendBytes($size, $data)
  79. {
  80. if ($size == 0) {
  81. return 0;
  82. }
  83. $b = QRbitstream::newFromBytes($size, $data);
  84. if (is_null($b)) {
  85. return -1;
  86. }
  87. $ret = $this->append($b);
  88. unset($b);
  89. return $ret;
  90. }
  91. public function toByte()
  92. {
  93. $size = $this->size();
  94. if ($size == 0) {
  95. return array();
  96. }
  97. $data = array_fill(0, (int) (($size + 7) / 8), 0);
  98. $bytes = (int) ($size / 8);
  99. $p = 0;
  100. for ($i = 0; $i < $bytes; $i++) {
  101. $v = 0;
  102. for ($j = 0; $j < 8; $j++) {
  103. $v = $v << 1;
  104. $v |= $this->data[$p];
  105. $p++;
  106. }
  107. $data[$i] = $v;
  108. }
  109. if ($size & 7) {
  110. $v = 0;
  111. for ($j = 0; $j < ($size & 7); $j++) {
  112. $v = $v << 1;
  113. $v |= $this->data[$p];
  114. $p++;
  115. }
  116. $data[$bytes] = $v;
  117. }
  118. return $data;
  119. }
  120. }
  121. ?>