BarcodeGenerator::qr_encode_data

  1. Bitrix24 API (v. 23.675.0)
  2. ui
  3. BarcodeGenerator
  4. qr_encode_data
  • Модуль: ui
  • Путь к файлу: ~/bitrix/modules/ui/lib/barcode/barcodegenerator.php
  • Класс: BitrixUIBarcodeBarcodeGenerator
  • Вызов: BarcodeGenerator::qr_encode_data
private function qr_encode_data($data, $ecl) {
	$mode = $this->qr_detect_mode($data);
	$version = $this->qr_detect_version($data, $mode, $ecl);
	$version_group = (($version < 10) ? 0 : (($version < 27) ? 1 : 2));
	$ec_params = $this->qr_ec_params[($version - 1) * 4 + $ecl];
	/* Don't cut off mid-character if exceeding capacity. */
	$max_chars = $this->qr_capacity[$version - 1][$ecl][$mode];
	if ($mode == 3) $max_chars <<= 1;
	$data = substr($data, 0, $max_chars);
	/* Convert from character level to bit level. */
	switch ($mode) {
		case 0:
			$code = $this->qr_encode_numeric($data, $version_group);
			break;
		case 1:
			$code = $this->qr_encode_alphanumeric($data, $version_group);
			break;
		case 2:
			$code = $this->qr_encode_binary($data, $version_group);
			break;
		case 3:
			$code = $this->qr_encode_kanji($data, $version_group);
			break;
	}
	for ($i = 0; $i < 4; $i++) $code[] = 0;
	while (count($code) % 8) $code[] = 0;
	/* Convert from bit level to byte level. */
	$data = array();
	for ($i = 0, $n = count($code); $i < $n; $i += 8) {
		$byte = 0;
		if ($code[$i + 0]) $byte |= 0x80;
		if ($code[$i + 1]) $byte |= 0x40;
		if ($code[$i + 2]) $byte |= 0x20;
		if ($code[$i + 3]) $byte |= 0x10;
		if ($code[$i + 4]) $byte |= 0x08;
		if ($code[$i + 5]) $byte |= 0x04;
		if ($code[$i + 6]) $byte |= 0x02;
		if ($code[$i + 7]) $byte |= 0x01;
		$data[] = $byte;
	}
	for (
		$i = count($data), $a = 1, $n = $ec_params[0];
		$i < $n; $i++, $a ^= 1
	) {
		$data[] = $a ? 236 : 17;
	}
	/* Return. */
	return array($mode, $version, $ec_params, $data);
}

Добавить комментарий