gpt4 book ai didi

algorithm - 在列数固定的 PDF417 条码中,我如何计算某些文本所需的行数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:02:10 24 4
gpt4 key购买 nike

我需要从一些文本生成 PDF417 条形码。我有一个 API(我没有创建)根据数据、行数和列数(以及与问题无关的其他参数)生成 PDF417 条形码。

我的 PDF417 条码使用文本编码。这意味着 1 个代码字最多可以容纳 2 个字符。现在,列数必须固定,因为我在非常有限的空间内打印此条形码。

以下是我从this document推断出来的(请参阅第 38 页 - 调整条码大小):

  1. 令每行的代码字数 CWPerRow = 7。
  2. 某些给定文本所需的代码字数,ReqCW = strlen(text)/2。
  3. 所需的行数 = ReqCW/CWPerRow

当我测试上述算法时,没有任何显示。当我在数据非常小且行数 = 25 时使用相同的 API 时,条形码打印得很好(通过各种条形码扫描仪验证)。

那么,当列数已知时,如何计算某些给定文本所需的行数?

最佳答案

您可以查看一些 PDF417 实现的源代码,例如 ZXing

文本编码不仅仅是每个代码字两个字符。如果您使用除大写字母和空格之外的任何其他字符,编码器将添加额外的字符来切换字符集等。您真的必须 encode the text 才能看到它会变成多少个代码字。

public class Test
{
public static void main(String[] args)
{
String msg = "Hello, world!";
int columns = 7;
int sourceCodeWords = calculateSourceCodeWords(msg);
int errorCorrectionCodeWords = getErrorCorrectionCodewordCount(0);
int rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, columns);
System.out.printf("\"%s\" requires %d code-words, and %d error correction code-words. This becomes %d rows.%n",
msg, sourceCodeWords, errorCorrectionCodeWords, rows);
}


public static int calculateNumberOfRows(int sourceCodeWords, int errorCorrectionCodeWords, int columns) {
int rows = ((sourceCodeWords + 1 + errorCorrectionCodeWords) / columns) + 1;
if (columns * rows >= (sourceCodeWords + 1 + errorCorrectionCodeWords + columns)) {
rows--;
}
return rows;
}

public static int getErrorCorrectionCodewordCount(int errorCorrectionLevel) {
if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8) {
throw new IllegalArgumentException("Error correction level must be between 0 and 8!");
}
return 1 << (errorCorrectionLevel + 1);
}

private static boolean isAlphaUpper(char ch) {
return ch == ' ' || (ch >= 'A' && ch <= 'Z');
}

private static boolean isAlphaLower(char ch) {
return ch == ' ' || (ch >= 'a' && ch <= 'z');
}

private static boolean isMixed(char ch) {
return "\t\r #$%&*+,-./0123456789:=^".indexOf(ch) > -1;
}

private static boolean isPunctuation(char ch) {
return "\t\n\r!\"$'()*,-./:;<>?@[\\]_`{|}~".indexOf(ch) > -1;
}

private static final int SUBMODE_ALPHA = 0;
private static final int SUBMODE_LOWER = 1;
private static final int SUBMODE_MIXED = 2;
private static final int SUBMODE_PUNCTUATION = 3;

public static int calculateSourceCodeWords(String msg)
{
int len = 0;
int submode = SUBMODE_ALPHA;
int msgLength = msg.length();
for (int idx = 0; idx < msgLength;)
{
char ch = msg.charAt(idx);
switch (submode)
{
case SUBMODE_ALPHA:
if (isAlphaUpper(ch))
{
len++;
}
else
{
if (isAlphaLower(ch))
{
submode = SUBMODE_LOWER;
len++;
continue;
}
else if (isMixed(ch))
{
submode = SUBMODE_MIXED;
len++;
continue;
}
else
{
len += 2;
break;
}
}
break;
case SUBMODE_LOWER:
if (isAlphaLower(ch))
{
len++;
}
else
{
if (isAlphaUpper(ch))
{
len += 2;
break;
}
else if (isMixed(ch))
{
submode = SUBMODE_MIXED;
len++;
continue;
}
else
{
len += 2;
break;
}
}
break;
case SUBMODE_MIXED:
if (isMixed(ch))
{
len++;
}
else
{
if (isAlphaUpper(ch))
{
submode = SUBMODE_ALPHA;
len++;
continue;
}
else if (isAlphaLower(ch))
{
submode = SUBMODE_LOWER;
len++;
continue;
}
else
{
if (idx + 1 < msgLength)
{
char next = msg.charAt(idx + 1);
if (isPunctuation(next))
{
submode = SUBMODE_PUNCTUATION;
len++;
continue;
}
}
len += 2;
}
}
break;
default:
if (isPunctuation(ch))
{
len++;
}
else
{
submode = SUBMODE_ALPHA;
len++;
continue;
}
break;
}
idx++; // Don't increment if 'continue' was used.
}
return (len + 1) / 2;
}
}

输出:

"Hello, world!" requires 9 code-words, and 2 error correction code-words. This becomes 2 rows.

关于algorithm - 在列数固定的 PDF417 条码中,我如何计算某些文本所需的行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16898890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com