📄 barcodedatamatrix.java
字号:
for (; ptrIn < textLength; ++ptrIn) { c = x[ptrIn]; if (ptrOut >= dataLength) break; if (c < 40) { if (ptrIn == 0 || (ptrIn > 0 && x[ptrIn - 1] > 40)) data[dataOffset + ptrOut++] = (byte)238; if (ptrOut + 2 > dataLength) break; n = 1600 * x[ptrIn] + 40 * x[ptrIn + 1] + x[ptrIn + 2] + 1; data[dataOffset + ptrOut++] = (byte)(n / 256); data[dataOffset + ptrOut++] = (byte)n; ptrIn += 2; } else { if (ptrIn > 0 && x[ptrIn - 1] < 40) data[dataOffset + ptrOut++] = (byte)254; ci = text[ptrIn + textOffset] & 0xff; if (ci > 127) { data[dataOffset + ptrOut++] = (byte)235; ci -= 128; } if (ptrOut >= dataLength) break; data[dataOffset + ptrOut++] = (byte)(ci + 1); } } c = 100; if (textLength > 0) c = x[textLength - 1]; if (ptrIn != textLength || (c < 40 && ptrOut >= dataLength)) return -1; if (c < 40) data[dataOffset + ptrOut++] = (byte)(254); return ptrOut; } private static int EdifactEncodation(byte[] text, int textOffset, int textLength, byte[] data, int dataOffset, int dataLength) { int ptrIn, ptrOut, edi, pedi, c; if (textLength == 0) return 0; ptrIn = 0; ptrOut = 0; edi = 0; pedi = 18; boolean ascii = true; for (; ptrIn < textLength; ++ptrIn) { c = text[ptrIn + textOffset] & 0xff; if (((c & 0xe0) == 0x40 || (c & 0xe0) == 0x20) && c != '_') { if (ascii) { if (ptrOut + 1 > dataLength) break; data[dataOffset + ptrOut++] = (byte)240; ascii = false; } c &= 0x3f; edi |= c << pedi; if (pedi == 0) { if (ptrOut + 3 > dataLength) break; data[dataOffset + ptrOut++] = (byte)(edi >> 16); data[dataOffset + ptrOut++] = (byte)(edi >> 8); data[dataOffset + ptrOut++] = (byte)edi; edi = 0; pedi = 18; } else pedi -= 6; } else { if (!ascii) { edi |= ('_' & 0x3f) << pedi; if (ptrOut + (3 - pedi / 8) > dataLength) break; data[dataOffset + ptrOut++] = (byte)(edi >> 16); if (pedi <= 12) data[dataOffset + ptrOut++] = (byte)(edi >> 8); if (pedi <= 6) data[dataOffset + ptrOut++] = (byte)edi; ascii = true; pedi = 18; edi = 0; } if (c > 127) { if (ptrOut >= dataLength) break; data[dataOffset + ptrOut++] = (byte)235; c -= 128; } if (ptrOut >= dataLength) break; data[dataOffset + ptrOut++] = (byte)(c + 1); } } if (ptrIn != textLength) return -1; if (!ascii) { edi |= ('_' & 0x3f) << pedi; if (ptrOut + (3 - pedi / 8) > dataLength) return -1; data[dataOffset + ptrOut++] = (byte)(edi >> 16); if (pedi <= 12) data[dataOffset + ptrOut++] = (byte)(edi >> 8); if (pedi <= 6) data[dataOffset + ptrOut++] = (byte)edi; } return ptrOut; } private static int C40OrTextEncodation(byte[] text, int textOffset, int textLength, byte[] data, int dataOffset, int dataLength, boolean c40) { int ptrIn, ptrOut, encPtr, last0, last1, i, a, c; String basic, shift2, shift3; if (textLength == 0) return 0; ptrIn = 0; ptrOut = 0; if (c40) data[dataOffset + ptrOut++] = (byte)230; else data[dataOffset + ptrOut++] = (byte)239; shift2 = "!\"#$%&'()*+,-./:;<=>?@[\\]^_"; if (c40) { basic = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; shift3 = "`abcdefghijklmnopqrstuvwxyz{|}~\177"; } else { basic = " 0123456789abcdefghijklmnopqrstuvwxyz"; shift3 = "`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~\177"; } int[] enc = new int[textLength * 4 + 10]; encPtr = 0; last0 = 0; last1 = 0; while (ptrIn < textLength) { if ((encPtr % 3) == 0) { last0 = ptrIn; last1 = encPtr; } c = text[textOffset + ptrIn++] & 0xff; if (c > 127) { c -= 128; enc[encPtr++] = 1; enc[encPtr++] = 30; } int idx = basic.indexOf((char)c); if (idx >= 0) { enc[encPtr++] = idx + 3; } else if (c < 32) { enc[encPtr++] = 0; enc[encPtr++] = c; } else if ((idx = shift2.indexOf((char)c)) >= 0) { enc[encPtr++] = 1; enc[encPtr++] = idx; } else if ((idx = shift3.indexOf((char)c)) >= 0) { enc[encPtr++] = 2; enc[encPtr++] = idx; } } if ((encPtr % 3) != 0) { ptrIn = last0; encPtr = last1; } if (encPtr / 3 * 2 > dataLength - 2) { return -1; } i = 0; for (; i < encPtr; i += 3) { a = 1600 * enc[i] + 40 * enc[i + 1] + enc[i + 2] + 1; data[dataOffset + ptrOut++] = (byte)(a / 256); data[dataOffset + ptrOut++] = (byte)a; } data[ptrOut++] = (byte)254; i = asciiEncodation(text, ptrIn, textLength - ptrIn, data, ptrOut, dataLength - ptrOut); if (i < 0) return i; return ptrOut + i; } private static int getEncodation(byte[] text, int textOffset, int textSize, byte[] data, int dataOffset, int dataSize, int options, boolean firstMatch) { int e, j, k; int[] e1 = new int[6]; if (dataSize < 0) return -1; e = -1; options &= 7; if (options == 0) { e1[0] = asciiEncodation(text, textOffset, textSize, data, dataOffset, dataSize); if (firstMatch && e1[0] >= 0) return e1[0]; e1[1] = C40OrTextEncodation(text, textOffset, textSize, data, dataOffset, dataSize, false); if (firstMatch && e1[1] >= 0) return e1[1]; e1[2] = C40OrTextEncodation(text, textOffset, textSize, data, dataOffset, dataSize, true); if (firstMatch && e1[2] >= 0) return e1[2]; e1[3] = b256Encodation(text, textOffset, textSize, data, dataOffset, dataSize); if (firstMatch && e1[3] >= 0) return e1[3]; e1[4] = X12Encodation(text, textOffset, textSize, data, dataOffset, dataSize); if (firstMatch && e1[4] >= 0) return e1[4]; e1[5] = EdifactEncodation(text, textOffset, textSize, data, dataOffset, dataSize); if (firstMatch && e1[5] >= 0) return e1[5]; if (e1[0] < 0 && e1[1] < 0 && e1[2] < 0 && e1[3] < 0 && e1[4] < 0 && e1[5] < 0) { return -1; } j = 0; e = 99999; for (k = 0; k < 6; ++k) { if (e1[k] >= 0 && e1[k] < e) { e = e1[k]; j = k; } } if (j == 0) e = asciiEncodation(text, textOffset, textSize, data, dataOffset, dataSize); else if (j == 1) e = C40OrTextEncodation(text, textOffset, textSize, data, dataOffset, dataSize, false); else if (j == 2) e = C40OrTextEncodation(text, textOffset, textSize, data, dataOffset, dataSize, true); else if (j == 3) e = b256Encodation(text, textOffset, textSize, data, dataOffset, dataSize); else if (j == 4) e = X12Encodation(text, textOffset, textSize, data, dataOffset, dataSize); return e; } switch (options) { case DM_ASCII: return asciiEncodation(text, textOffset, textSize, data, dataOffset, dataSize); case DM_C40: return C40OrTextEncodation(text, textOffset, textSize, data, dataOffset, dataSize, true); case DM_TEXT: return C40OrTextEncodation(text, textOffset, textSize, data, dataOffset, dataSize, false); case DM_B256: return b256Encodation(text, textOffset, textSize, data, dataOffset, dataSize); case DM_X21: return X12Encodation(text, textOffset, textSize, data, dataOffset, dataSize); case DM_EDIFACT: return EdifactEncodation(text, textOffset, textSize, data, dataOffset, dataSize); case DM_RAW: if (textSize > dataSize) return -1; System.arraycopy(text, textOffset, data, dataOffset, textSize); return textSize; } return -1; } private static int getNumber(byte[] text, int ptrIn, int n) { int v, j, c; v = 0; for (j = 0; j < n; ++j) { c = text[ptrIn++] &0xff; if (c < '0' || c > '9') return -1; v = v * 10 + c - '0'; } return v; } private int processExtensions(byte[] text, int textOffset, int textSize, byte[] data) { int order, ptrIn, ptrOut, eci, fn, ft, fi, c; if ((options & DM_EXTENSION) == 0) return 0; order = 0; ptrIn = 0; ptrOut = 0; while (ptrIn < textSize) { if (order > 20) return -1; c = text[textOffset + ptrIn++] &0xff; ++order; switch (c) { case '.': extOut = ptrIn; return ptrOut; case 'e': if (ptrIn + 6 > textSize) return -1; eci = getNumber(text, textOffset + ptrIn, 6); if (eci < 0) return -1; ptrIn += 6; data[ptrOut++] = (byte)241; if (eci < 127) data[ptrOut++] = (byte)(eci + 1); else if (eci < 16383) { data[ptrOut++] = (byte)((eci - 127) / 254 + 128); data[ptrOut++] = (byte)(((eci - 127) % 254) + 1); } else { data[ptrOut++] = (byte)((eci - 16383) / 64516 + 192); data[ptrOut++] = (byte)((((eci - 16383) / 254) % 254) + 1); data[ptrOut++] = (byte)(((eci - 16383) % 254) + 1); } break; case 's': if (order != 1) return -1; if (ptrIn + 9 > textSize) return -1; fn = getNumber(text, textOffset + ptrIn, 2); if (fn <= 0 || fn > 16) return -1; ptrIn += 2; ft = getNumber(text, textOffset + ptrIn, 2); if (ft <= 1 || ft > 16) return -1; ptrIn += 2; fi = getNumber(text, textOffset + ptrIn, 5); if (fi < 0 || fn >= 64516) return -1; ptrIn += 5; data[ptrOut++] = (byte)(233); data[ptrOut++] = (byte)(((fn - 1) << 4) | (17 - ft)); data[ptrOut++] = (byte)(fi / 254 + 1); data[ptrOut++] = (byte)((fi % 254) + 1); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -