У меня есть принтер Epson TM-T88VI, и я использую Microsoft.PointOfService.PosPrinter на C # для печати.
Я пытаюсь распечатать QR-коды с помощью команд ESC POS.
Все работает нормально, пока не распечатает данные QR-кода с более чем 125 байтами.
Это моя функция:
private string fct180(string data)
{
byte[] barr = System.Text.ASCIIEncoding.ASCII.GetBytes(data);
int len = barr.Length + 3;
byte pH = (byte)(len / 256);
byte pL = (byte)(len - (256 * pH));
byte[] cmd = new byte[8 + barr.Length];
cmd[0] = 29;
cmd[1] = 40;
cmd[2] = 107;
cmd[3] = pL;
cmd[4] = pH;
cmd[5] = 49;
cmd[6] = 80;
cmd[7] = 48;
Array.Copy(barr, 0, cmd, 8, barr.Length);
string testing = System.Text.ASCIIEncoding.ASCII.GetString(cmd);
byte[] rere = System.Text.ASCIIEncoding.ASCII.GetBytes(testing);
string ret = System.Text.ASCIIEncoding.ASCII.GetString(cmd);
return ret;
}
Моя ситуация:
1) Сначала я пытаюсь сгенерировать QR-код с длиной строки содержимого 124: data
is "AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXX"
Этот QR-код напечатан правильно (pL равно 127, pH равно 0), pL кодируется как "\ u007f": "\u001d(k\u007f\01P0AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXX"
Значение rere[3]:
127, значение rere[4]
= 0
2) Затем я пытаюсь сгенерировать QR-код с длиной строки 125: data
is "AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXXT"
Этот QR-код не печатается (pL равно 128, pH равно 0), pL кодируется как "?" который имеет байтовое значение 63:
"\u001d(k?\01P0AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXXT"
Значение rere[3]:
63, значение rere[4]
= 0
Я хочу получить два штрих-кода один за другим, но я получаю только один и часть содержимого второго QR-кода в виде простого текста. Как вы можете видеть здесь: На картинке показан QR-код 1) и текстовая часть 2)
Первые 63 символа стираются, а символы 64+ печатаются как обычный текст. Хорошо, это потому, что значение байта 63 вместо 128. Но почему QR-код не печатается с 63 символами?
Это потому, что значение байта 128 кодируется как строковый символ «?». Но как я могу распечатать свой QR-код с помощью Microsoft.PointOfService.PosPrinter.PrintNormal, если я не могу сохранить строки со значениями байтов> 127?
Есть ли альтернативный вызов функции в классе PosPrinter, который принимает простые байтовые массивы? Я еще не нашел.
Есть ли другое решение, кроме PosPrinter.PrintBarcode?
Что ты предлагаешь?
РЕДАКТИРОВАТЬ: Решение. Я использовал массив байтов, а затем преобразовал каждый отдельный байт (через char) в строку. В этой строке вместо кодировки используются простые байтовые значения. Затем я использую escape-последовательность «ESC | [*] # E». Затем он используется в PrintNormal. Это направляет строку непосредственно на принтер без промежуточной обработки. Теперь также можно обрабатывать байтовые значения> 127.
string ESC = System.Text.ASCIIEncoding.ASCII.GetString(new byte[] { 27 });
byte[] bqr = ...;
string data = "";
for (int i = 0; i < bqr.Length; ++i)
{
data += (char)bqr[i];
}
string cmd = ESC + "|*" + data.Length + "E" + data;
printer.PrintNormal(PrinterStation.Receipt, cmd)