Как создать QRCode из необработанных байтов в TypeScript и Angular - PullRequest
0 голосов
/ 28 января 2019

Я создал простое веб-приложение, которое получает некоторые коды из конечной точки и генерирует ключ, из которого должен быть сгенерирован QR-код.

Конечный ключ - это Uint8Arrayэто нужно сделать в QRCode, я использую библиотеку angularx-qrcode, а затем преобразую Uint8Array в строку, используя String.fromCharCode.apply(null, uintArray), однако этот подход оказывается неэффективным для моего случая.

Мне нужно сгенерировать QRCode из необработанных значений HEX из моего массива, однако при использовании String.fromCharCode кажется, что он генерирует символы UTF-8, таким образом генерируя неожиданные символы.

До сих пор я пытался использовать библиотекучтобы преобразовать строку в 'ISO-8859-1' с именем iconv-lite, но, похоже, это не сработало.

Я также попытался преобразовать строку, как эта decodeURIComponent(escape(encodedString));, однако это выдает ошибку, говорящую как недействительныйURI, вероятно, потому, что в ключе конца есть недопустимые символы, которые не работают с этой функцией.

Ниже приведен пример массива байтов, длина которого всегда 20 байтов.156,0,0,0,0,0,148,131,114,7,121,81,85,9,0,0,84,69,48,171

После того, как я дал ему немного, я думаю, что проблема также может быть связана с самой библиотекой QR-кода, поэтому я искал библиотеку QR-кода, которая получает Uint8Array вместостроку, но мне не удалось ее найти.

Один из моих коллег смог решить эту проблему в приложении для Android, закончив строку как ISO-8859-1 вместо UTF-8.

Я полагаю, что решением было бы сгенерировать QRCode из массива байтов напрямую, чтобы мне не пришлось беспокоиться о кодировке символов, но если кто-то знает другой подход для решения этой проблемы, я бы с удовольствием попробовал.

Мне нужна строка RAW, сгенерированная из этих байтов, например, первый байт 156, в шестнадцатеричном - 9c, поэтому мне нужен символ, представляющий 9c, однако 9c не является «обычным»Символ ASCII, поэтому String.fromCharCode у меня не работает, длина конечной строки должна быть точно 20 байтов, как и у массива.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Мне удалось решить мою проблему с помощью этой библиотеки: QR-код-генератор

Это позволяет генерировать QR-коды из массива байтов, а также обычные строки.

Он очень легкий и простой в использовании, и поддерживает множество различных языков программирования.Единственным недостатком является то, что он не поддерживает NPM, и его реализация TypeScript по умолчанию немного скудна, для работы с моим проектом ему потребовалась некоторая настройка, но, в конце концов, он работал отлично, он даже поддерживает вывод SVG.

0 голосов
/ 28 января 2019

Как я понимаю, у вас проблемы с генерацией шестнадцатеричной строки из байтового массива?Попробуйте эту функцию:

function byteToHex(byte) {
  // convert the possibly signed byte (-128 to 127) to an unsigned byte (0 to 255).
  // if you know, that you only deal with unsigned bytes (Uint8Array), you can omit this line
  const unsignedByte = byte & 0xff;

  // If the number can be represented with only 4 bits (0-15), 
  // the hexadecimal representation of this number is only one char (0-9, a-f). 
  if (unsignedByte < 16) {
    return '0' + unsignedByte.toString(16);
  } else {
    return unsignedByte.toString(16);
  }
}

// bytes is a typed array (Int8Array or Uint8Array)
function toHexString(bytes) {
  // Since the .map() method is not available for typed arrays, 
  // we will convert the typed array to an array using Array.from().
  return Array.from(bytes)
    .map(byte => byteToHex(byte))
    .join('');
}

Кредиты: https://stackoverflow.com/a/54095276/2036886

...