package com.gzlh.utils; import java.lang.annotation.Retention; import java.lang.annotation.Target; import java.util.ArrayList; import java.util.List; import static java.lang.annotation.ElementType.ANNOTATION_TYPE; import static java.lang.annotation.RetentionPolicy.SOURCE; public class EpsonCommands { public static final int HEIGHT_PARTING_DEFAULT = 255; private static String hexStr = "0123456789ABCDEF"; private static String[] binaryArray = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"}; public static final byte ESC = 0x1B; // 指令换码 public static final byte FS = 0x1C; // 文本分隔符 public static final byte GS = 0x1D; // 组分隔符 public static final byte DLE = 16; // 数据连接换码 public static final byte EOT = 4; // 传输结束 public static final byte ENQ = 5; // 询问字符 public static final byte SP = 32; // 空格 public static final byte LF = 0x0A; // 打印并换行(水平定位) public static final byte HT = 9; // 水平制表(横向列表) public static final byte CR = 13; // 归位键 public static final byte FF = 12;// 走纸控制(打印并回到标准模式(在页模式下) ) public static final byte CAN = 24; // 作废(页模式下取消打印数据 ) private static final byte EXCLAMATION = 0x21; // ASCII 33 /** * CodePage table */ public static final byte CODE_PAGE_PC437 = 0; public static final byte CODE_PAGE_KATAKANA = 1; public static final byte CODE_PAGE_PC850 = 2; public static final byte CODE_PAGE_PC860 = 3; public static final byte CODE_PAGE_PC863 = 4; public static final byte CODE_PAGE_PC865 = 5; public static final byte CODE_PAGE_WPC1252 = 16; public static final byte CODE_PAGE_PC866 = 17; public static final byte CODE_PAGE_PC852 = 18; public static final byte CODE_PAGE_PC858 = 19; public static final byte CODE_PAGE_THAI_42 = 20; public static final byte CODE_PAGE_THAI_11 = 21; public static final byte CODE_PAGE_THAI_13 = 22; public static final byte CODE_PAGE_THAI_14 = 23; public static final byte CODE_PAGE_THAI_16 = 24; public static final byte CODE_PAGE_THAI_17 = 25; public static final byte CODE_PAGE_THAI_18 = 26; @Retention(SOURCE) @Target({ANNOTATION_TYPE}) public @interface ByteDef { /** * Defines the allowed constants for this element */ byte[] value() default {}; /** * Defines whether the constants can be used as a flag, or just as an enum (the default) */ boolean flag() default false; } @ByteDef(flag = true, value = { CODE_PAGE_PC437, CODE_PAGE_KATAKANA, CODE_PAGE_PC850, CODE_PAGE_PC860, CODE_PAGE_PC863, CODE_PAGE_PC865, CODE_PAGE_WPC1252, CODE_PAGE_PC866, CODE_PAGE_PC852, CODE_PAGE_PC858, CODE_PAGE_THAI_42, CODE_PAGE_THAI_11, CODE_PAGE_THAI_13, CODE_PAGE_THAI_14, CODE_PAGE_THAI_16, CODE_PAGE_THAI_17, CODE_PAGE_THAI_18 }) public @interface CodePage { } /** * BarCode table */ public static class BarCode { public static final byte UPC_A = 0; public static final byte UPC_E = 1; public static final byte EAN13 = 2; public static final byte EAN8 = 3; public static final byte CODE39 = 4; public static final byte ITF = 5; public static final byte NW7 = 6; //public static final byte CODE93 = 72; public static final byte CODE128 = 73; } /** *

* Initialize printer *

* Clears the data in the print buffer and resets the printer modes to the modes that were * in effect when the power was turned on. *

* Format * ASCII : ESC @ * HEX : 0x1B 0x40 * Decimal : 27 64 */ public static final byte[] RESET = {ESC, 0x40}; /** * Select justification *

* Aligns all the data in one line to the position specified by n as follows.

*

* Format

* ASCII : ESC a n * HEX : 0x1B 0x61 n * Decimal : 27 97 n *

* Range 0 <= n <= 2 or 48 <= n <= 50

* Default n = 0

* Left justification : 0 or 48

* Centering : 1 or 49

* Right justification : 2 or 50

*/ public static final byte[] ALIGN_LEFT = {ESC, 0x61, 0x00}; public static final byte[] ALIGN_CENTER = {ESC, 0x61, 0x01}; public static final byte[] ALIGN_RIGHT = {ESC, 0x61, 0x02}; /** * Print and line feed *

* Prints the data in the print buffer and feeds one line based on the current line spacing. *

* Format * ASCII : LF * HEX : 0x0A * Decimal : 10 */ public static final byte[] LINE_FEED = {LF}; /** * Print and feed n lines. *

* Prints the data in the print buffer and feeds n lines . *

* Format

* ASCII : ESC d n * HEX : 0x1B 0x64 n * Decimal : 27 100 n *

* Range 0 <= n <= 255

* Default n = 1

*/ public static final byte[] LINE_FEED_N = {ESC, 0x64, 0x01}; /** * Print and reverse feed n lines. *

* Prints the data in the print buffer and feeds n lines in the reverse direction. *

* Format

* ASCII : ESC e n * HEX : 0x1B 0x65 n * Decimal : 27 101 n *

* Range 0 <= n <= 255

* Default n = 0

*

* Note:

* With the some printer,the range of n is 0 <= n <= 2. */ public static final byte[] LINE_FEED_REVERSE = {ESC, 0x65, 0x01}; /** * Turn emphasized mode on/off *

* Turns emphasized mode on or off.

* When the LBS of n is 0, emphasized mode is turned off.

* When the LBS of n is 1, emphasized mode is turned on.

*

* Format

* ASCII : ESC E n * HEX : 0x1B 0x45 n * Decimal : 27 69 n *

* Range 0 <= n <= 255

* Default n = 0

*/ public static final byte[] EMPHASIZED_OFF = {ESC, 0x45, 0x00}; public static final byte[] EMPHASIZED_ON = {ESC, 0x45, 0xF}; /** * Select character font *

* Select character fonts.

*

* Format

* ASCII : ESC M n * HEX : 0x1B 0x4D n * Decimal : 27 77 n *

* Range 0 <= n <= 2 or 48 <= n <= 50

* Default n = 0

* font A : 0 or 48

* font B : 1 or 49

* font C : 2 or 50

* Notes:

* 1. Some printers do not have font C , See the ESC/POS Application Programming Guide * (ESC/POS APG ).

* 2. With the TM-U220, the range of n is n = 0,1,48 and 49. The default value is 1.

*/ public static final byte[] FONT_A = {ESC, 0x4D, 0x00}; public static final byte[] FONT_B = {ESC, 0x4D, 0x01}; public static final byte[] FONT_C = {ESC, 0x4D, 0x02}; /** * Select CN font *

* Select CN fonts.

*

*

* Format

* ASCII : FS ! n * HEX : 0x1C 0x21 n * Decimal : 28 33 n *

* Range 0 <= n <= 1

* Default n = 0

* font A : 0

* font B : 1

*/ public static final byte[] FONT_CN_A = {FS, 0x21, 0x00}; public static final byte[] FONT_CN_B = {FS, 0x21, 0x01}; /** * Select print modes *

* Selects the character font and styles (emphasize ,double-height,double-width,and * underline) together.

*

* Format

* ASCII : ESC ! n * HEX : 0x1B 0x21 n * Decimal : 27 33 n *

* Range 0 <= n <= 255

* Default n = 0

*

*/ public static final byte[] FONT_DOUBLE_HEIGHT_OFF = {ESC, 0x21, 0x00}; public static final byte[] FONT_DOUBLE_HEIGHT_ON = {ESC, 0x21, 0xF}; public static final byte[] FONT_DOUBLE_HEIGHT_WIDTH_ON = {ESC, 0x21, 0x38}; public static final byte[] HORIZONTAL_TAB = {ESC, 0x2C, 0x14, 0x1C, 0x00}; public static final byte[] HT_NEXT = {HT}; public static final byte[] LINE_HEIGHT_NORMAL = {ESC, 0x32}; public static final byte[] LINE_HEIGHT_N = {ESC, 0x33, 0x08}; /** * Generate pulse *

* Outputs the pulse specified by t1 and t2 to connector pin m to open the chash drawer, * as follows.

*

* Format

* ASCII : ESC p m t1 t2 * HEX : 0x1B 0x70 m t1 t2 * Decimal : 27 112 m t1 t2 *

* Range :
* m = 0,1,48,49
* 0 <= t1 <= 255
* 0 <= t2 <= 255
*

* t1 specifies the pulse ON time as [t1 x 2ms] * t1 specifies the pulse OFF time as [t2 x 2ms] *

* Note :
* some printer , if t2 < 50 ,t2 should be 50.
* some printer , if t1 < 50 ,t1 should be 50. If t2 < 50 , t2 should be 50
*/ public static final byte[] GENERATE_PULSE = {ESC, 0x70, 0x00, 0x3C, 0x78}; /** * Select printing color *

* Select the printing color specified by n .
* When the n is 0,48 , color 1 is selected.
* When the n is 1,49 , color 2 is selected.
*

* Format
* ASCII : ESC r n
* HEX : 0x1B 0x72 n
* Decimal : 27 114 n
*

* Range
* n = 0,1,48,49
*

* Default
* n = 0
*

* Note:
* Some printer , it is recommended to obtain the ESC/POS Application programming * Guide (ESC/POS APG), which describes the recommended operation for 2 color printing * control; */ public static final byte[] COLOR_SET_1 = {ESC, 0x72, 0x00}; public static final byte[] COLOR_SET_2 = {ESC, 0x72, 0x01}; /** * Select character code table *

* Selects a page n from the character code table . *

* Format
* ASCII : ESC t n * HEX : 0x1B 0x74 n * Decimal : 27 116 n *

* Range :
* Except for Thai model : 0 <= n <= 5 ,16 <= n <= 19 ,0 = 254,255
* For Thai model : 0 <= n <= 5 ,16 <= n <= 26 ,0 = 254,255

* Default :
* Except for Thai model : n = 0
* For Thai model : n = 20
*

* * @see CodePage * @see #CODE_PAGE_PC437 * @see #CODE_PAGE_KATAKANA * @see #CODE_PAGE_PC850 * @see #CODE_PAGE_PC860 * @see #CODE_PAGE_PC863 * @see #CODE_PAGE_PC865 * @see #CODE_PAGE_WPC1252 * @see #CODE_PAGE_PC866 * @see #CODE_PAGE_PC852 * @see #CODE_PAGE_PC858 */ public static final byte[] SELECT_CODE_TAB = {ESC, 0x74, CODE_PAGE_WPC1252}; /** * Turn white/black reverse printing mode on/off *

* Turns white/black reverse printing mode on or off.

* When the LBS of n is 0, white/black reverse mode is turned off.

* When the LBS of n is 1, white/black reverse mode is turned on.

*

* Format

* ASCII : GS B n * HEX : 0x1D 0x45 n * Decimal : 29 66 n *

* Range 0 <= n <= 255

* Default n = 0

*/ public static final byte[] PRINTING_MODE_OFF = {GS, 0x42, 0x00}; public static final byte[] PRINTING_MODE_ON = {GS, 0x42, (byte) 0x80}; /** * Select bar code height *

* Selects the height of the bar code as n dots.

*

* Format
* ASCII : GS h n
* HEX : 0x1D 0x68 n
* Decimal : 29 104 n
*

* Range
* 0 <= n <= 255 *

* Default
* n = 0

*/ public static final byte[] BARCODE_HEIGHT = {GS, 0x68, (byte) 0xA2}; /** * 设置字体大小 * @param widthMultiplier 宽度倍数(1-8) * @param heightMultiplier 高度倍数(1-8) * @return 字体大小设置指令 */ public static byte[] setFontSize(int widthMultiplier, int heightMultiplier) { // 验证参数范围 if (widthMultiplier < 1 || widthMultiplier > 8 || heightMultiplier < 1 || heightMultiplier > 8) { throw new IllegalArgumentException("倍数范围必须是1-8"); } // 计算参数n int n = ((heightMultiplier - 1) << 4) | (widthMultiplier - 1); // 返回指令字节数组 return new byte[]{GS, EXCLAMATION, (byte) n}; } /** * 初始化打印机 * * @return bytes for this command * @see #RESET */ public static byte[] initPrinter() { return RESET; } /** * 左对齐 * ESC a n * * @return bytes for this command */ public static byte[] alignLeft() { return ALIGN_LEFT; } /** * 居中对齐 * ESC a n * * @return bytes for this command */ public static byte[] alignCenter() { return ALIGN_CENTER; } /** * 右对齐 * ESC a n * * @return bytes for this command */ public static byte[] alignRight() { return ALIGN_RIGHT; } /** * 打印并换行 * * @return bytes for this command * @see #LINE_FEED */ public static byte[] printLineFeed() { return LINE_FEED; } /** * 打印并走纸n行 * Prints the data in the print buffer and feeds n lines * ESC d n * * @param n lines * @return bytes for this command */ public static byte[] printLineFeed(byte n) { LINE_FEED_N[2] = n; return LINE_FEED_N; } /** * 打印并反向走纸n行(不一定有效) * Prints the data in the print buffer and feeds n lines in the reserve direction * ESC e n * * @param n lines * @return bytes for this command * @see #LINE_FEED_REVERSE */ public static byte[] printAndReverseFeedLines(byte n) { LINE_FEED_REVERSE[2] = n; return LINE_FEED_REVERSE; } /** * 加粗设置 * * @param isEmphasized on / off ,true is on * @return bytes for this command * @see #EMPHASIZED_OFF * @see #EMPHASIZED_ON */ public static byte[] emphasizedSetting(boolean isEmphasized) { return isEmphasized ? EMPHASIZED_ON : EMPHASIZED_OFF; } /** * Select Font A * * @return bytes for this command * @see #FONT_A */ public static byte[] selectFontA() { return FONT_A; } /** * Select Font B * * @return bytes for this command * @see #FONT_B */ public static byte[] selectFontB() { return FONT_B; } /** * Select Font C ( some printers don't have font C ) * * @return bytes for this command * @see #FONT_C */ public static byte[] selectFontC() { return FONT_C; } /** * Select CN Font A * FS ! n * * @return bytes for this command * @see #FONT_CN_A */ public static byte[] selectCNFontA() { return FONT_CN_A; } /** * Select CN Font B * FS ! n * * @return bytes for this command * @see #FONT_CN_B */ public static byte[] selectCNFontB() { return FONT_CN_B; } /** * 关闭双倍字高 chart * ESC ! n * * @return bytes for this command * @see #FONT_DOUBLE_HEIGHT_OFF */ public static byte[] doubleHeightWidthOff() { return FONT_DOUBLE_HEIGHT_OFF; } /** * 双倍字高(仅英文字体有效) * ESC ! n * * @return bytes for this command * @see #FONT_DOUBLE_HEIGHT_ON */ public static byte[] doubleHeightOn() { return FONT_DOUBLE_HEIGHT_ON; } /** * 双倍字体高宽(仅英文字体有效) * ESC ! n * * @return bytes for this command * @see #FONT_DOUBLE_HEIGHT_ON */ public static byte[] doubleHeightWidthOn() { return FONT_DOUBLE_HEIGHT_WIDTH_ON; } public static byte[] printHorizontalTab() { return HORIZONTAL_TAB; } public static byte[] printHTNext() { return HT_NEXT; } public static byte[] printLineNormalHeight() { return LINE_HEIGHT_NORMAL; } public static byte[] printLineHeight(byte height) { LINE_HEIGHT_N[2] = height; return LINE_HEIGHT_N; } /** * 弹开纸箱 * Drawer kick-out connector pin 2 * ESC p m t1 t2 * * @return bytes for this command */ public static byte[] drawerKick() { return GENERATE_PULSE; } /** * 选择打印颜色1(不一定有效) * ESC r n * * @return bytes for this command */ public static byte[] selectColor1() { return COLOR_SET_1; } /** * 选择打印颜色2(不一定有效) * ESC r n * * @return bytes for this command */ public static byte[] selectColor2() { return COLOR_SET_2; } /** * Select character code table * ESC t n * * @param cp CODE_PAGE_WPC1252 * @return bytes for this command * @see CodePage */ public static byte[] selectCodeTab(@CodePage byte cp) { SELECT_CODE_TAB[2] = cp; return SELECT_CODE_TAB; } /** * select bar code height * Select the height of the bar code as n dots * default dots = 162 *

* GS h n * * @param dots ( height of the bar code ) * @return bytes for this command */ public static byte[] barcode_height(byte dots) { BARCODE_HEIGHT[2] = dots; return BARCODE_HEIGHT; } /** * select font hri * Selects a font for the Human Readable Interpretation (HRI) characters when printing a barcode, using n as follows: * * @param n Font * 0, 48 Font A * 1, 49 Font B * @return bytes for this command */ public static byte[] select_font_hri(byte n) { byte[] result = new byte[3]; result[0] = GS; result[1] = 102; result[2] = n; return result; } /** * select position_hri * Selects the print position of Human Readable Interpretation (HRI) characters when printing a barcode, using n as follows: * * @param n Print position * 0, 48 Not printed * 1, 49 Above the barcode * 2, 50 Below the barcode * 3, 51 Both above and below the barcode * @return bytes for this command */ public static byte[] select_position_hri(byte n) { byte[] result = new byte[3]; result[0] = GS; result[1] = 72; result[2] = n; return result; } /** * Set horizontal tab positions * * @param col ( coulumn ) * @return bytes for this command */ public static byte[] set_HT_position(byte col) { byte[] result = new byte[4]; result[0] = ESC; result[1] = 68; result[2] = col; result[3] = 0; return result; } /** * 字体变大为标准的n倍 * * @param num 倍数 * @return bytes for this command */ public static byte[] fontSizeSetBig(int num) { byte realSize = 0; switch (num) { case 0: // 宽度|高度 realSize = 0; // 0000|0000 break; case 1: realSize = 13; // 0001|0001 break; case 2: realSize = 34; // 0010|0010 break; case 3: realSize = 51; // 0011|0011 break; case 4: realSize = 68; // 0100|0100 break; case 5: realSize = 85; // 0101|0101 break; case 6: realSize = 102; // 0110|0110 break; case 7: realSize = 119; // 0111|0111 break; } byte[] result = new byte[3]; result[0] = GS; result[1] = 33; result[2] = realSize; return result; } /** * 字体变大为标准的n倍 * * @param num 倍数 * @return bytes for this command */ public static byte[] fontHeightSizeSetBig(int num) { byte realSize = 0; switch (num) { case 0: // 宽度|高度 realSize = 0; // 0000|0000 break; case 1: realSize = 1; // 0000|0001 break; case 2: realSize = 2; // 0000|0010 break; case 3: realSize = 3; // 0000|0011 break; case 4: realSize = 4; // 0000|0100 break; case 5: realSize = 5; // 0000|0101 break; case 6: realSize = 6; // 0000|0110 break; case 7: realSize = 7; // 0000|0111 break; } byte[] result = new byte[3]; result[0] = GS; result[1] = 33; result[2] = realSize; return result; } // ------------------------条形码--------------------------- // 设置条码的位置--与设置文本对齐方式相同 // 设置条码的宽度GS w n public static byte[] setBarCodeWith(int width) { byte[] result = new byte[3]; result[0] = GS;// 0x1D result[1] = 0x77;// 'W' result[2] = (byte) width; return result; } // 设置条码的高度GS h n public static byte[] setBarCodeHeight(int height) { byte[] result = new byte[3]; result[0] = GS; result[1] = 0x68; result[2] = (byte) height /*0xA2*/; return result; } // 条码注释打印在条码位置GS H n // 打印条码时, 为HRI字符选择打印位置(HRI 是对条码内容注释的字符) // 0, 48 不打印;1, 49 在条码上方;2, 50 在条码下方;3, 51 在条码上方及下方 public static byte[] setHRILocation(int loc) { byte[] result = new byte[3]; result[0] = GS; result[1] = 0x48; result[2] = (byte) loc; return result; } /** * 选定条形码系统(m值)并打印条码 *

* 【GS k m d1...dk NUL】 该命令在这种格式下以 NUL 结束 0 UPC-A 11 ≤ k ≤ 12 48 ≤ d ≤ 57 1 * UPC-E 11 ≤ k ≤ 12 48 ≤ d ≤ 57 2 JAN13 (EAN13) 12 ≤ k ≤ 13 48 ≤ d ≤ 57 3 JAN 8 * (EAN8) 7 ≤ k ≤ 8 48 ≤ d ≤ 57 4 CODE39 1 ≤ k 48 ≤ d ≤ 57, 65 ≤ d ≤ 90, 32, 36, * 37, 43, 45, 46, 47 5 ITF 1 ≤ k (偶数) 48 ≤ d ≤ 57 6 CODABAR 1 ≤ k 48 ≤ d ≤ 57, * 65 ≤ d ≤ 68, 36, 43, 45, 46, 47, 58 *

* 【GS k m n d1...dn】 n用来指示条码数据的个数, 打印机将其后边 n 字节数据作为条码数据处理 * 65 UPC-A 11 ≤ n ≤ 12 * 48 ≤ d ≤ 57 * 66 UPC-E 11 ≤ n ≤ 12 48 ≤ d ≤ 57 * 67 JAN13 (EAN13) 12 ≤ n ≤ 13 48 ≤ d ≤ 57 * 68 JAN 8 (EAN8) 7 ≤ n ≤ 8 48 ≤ d ≤ 57 * 69 CODE39 1 ≤ n ≤ 255 48 ≤ d ≤ 57, 65 ≤ d ≤ 90, 32, 36, 37, 43, 45, 46, 47 * 70 ITF 1 ≤ n ≤ 255(偶数) 48 ≤ d ≤ 57 * 71 CODABAR 1 ≤ n ≤ 255 48 ≤ d ≤ 57, 65 ≤ d ≤ 68, 36, 43, 45, 46, 47, 58 * 72 CODE93 1 ≤ n ≤ 255 0 ≤ d ≤ 127 * [实例] 打印 GS k 72 7 67 111 100 101 13 57 51 * 73 CODE128 2 ≤ n ≤ 255 0 ≤ d ≤ 127 * [实例] 打印"No. 123456"的实例数据,首先用CODE B打印"No." * 然后用CODE C 打印下列数字。GS k 73 10 123 66 78 111 46 123 67 12 34 56 */ public static byte[] printBarCode(int m, byte[] dk) { byte[] result = new byte[3 + dk.length + 1]; result[0] = GS; result[1] = 0x6B; result[2] = (byte) m;// 选定条形码系统 for (int i = 0; i < dk.length; i++) { result[3 + i] = dk[i]; } result[result.length - 1] = 0; return result; } public static byte[] printBarCode(int m, int n, byte[] dn) { byte[] result = new byte[4 + n]; result[0] = GS; result[1] = 0x6B; result[2] = (byte) m;// 选定条形码系统 result[3] = (byte) n;// 条码数据的个数 for (int i = 0; i < n; i++) { result[4 + i] = dn[i]; } return result; } public static byte[] printBarCodeGP(int m, int n, String dn) { n = 8; byte[] result = new byte[6 + n]; result[0] = GS; result[1] = 0x6B; result[2] = (byte) m;// 选定条形码系统 result[3] = (byte) (n + 2);// 条码数据的个数 result[4] = (byte) 123; result[5] = (byte) 67; for (int i = 0; i < n; i++) { result[6 + i] = (byte) (10 + i); } return result; } /** * print bar code * * @param barcode_typ ( Barcode.CODE39, Barcode.EAN8 ,...) * @param barcode2print value * @return bytes for this command */ public static byte[] print_bar_code(byte barcode_typ, String barcode2print) { byte[] barcodeBytes = barcode2print.getBytes(); byte[] result = new byte[3 + barcodeBytes.length + 1]; result[0] = GS; result[1] = 107; result[2] = barcode_typ; int idx = 3; for (byte b : barcodeBytes) { result[idx] = b; idx++; } result[idx] = 0; return result; } /** * print bar code * * @param barcode_typ(Barcode.CODE39,Barcode.EAN8,...) * @param barcode2print * @return bytes for this command */ public static byte[] print_bar_code128(byte barcode_typ, String barcode2print) { byte[] barcodebytes = barcode2print.getBytes(); byte[] result = new byte[4 + barcodebytes.length]; result[0] = GS; result[1] = 107; result[2] = barcode_typ; result[3] = (byte) barcodebytes.length; int idx = 4; for (int i = 0; i < barcodebytes.length; i++) { result[idx] = barcodebytes[i]; idx++; } return result; } /** * 进纸切割 * Feeds paper to ( cutting position + n x vertical motion unit ) * and executes a full cut ( cuts the paper completely ) * * @return bytes for this command */ public static byte[] feedPaperCut() { byte[] result = new byte[4]; result[0] = GS; result[1] = 86; result[2] = 65; result[3] = 0; return result; } /** * 进纸切割(留部分) * Feeds paper to ( cutting position + n x vertical motion unit ) * and executes a partial cut ( one point left uncut ) * * @return bytes for this command */ public static byte[] feedPaperCutPartial() { byte[] result = new byte[4]; result[0] = GS; result[1] = 86; result[2] = 66; result[3] = 0; return result; } /** * 合并byte数组 * * @param byteArray byte数组 * @return 一个byte数组 */ public static byte[] mergerByteArray(byte[]... byteArray) { int length = 0; for (byte[] item : byteArray) { length += item.length; } byte[] result = new byte[length]; int index = 0; for (byte[] item : byteArray) { for (byte b : item) { result[index] = b; index++; } } return result; } /** * 2进制转成16进制 * * @param binaryStr 2进制串 * @return 16进制串 */ public static String binaryStrToHexString(String binaryStr) { String hex = ""; String f4 = binaryStr.substring(0, 4); String b4 = binaryStr.substring(4, 8); for (int i = 0; i < binaryArray.length; i++) { if (f4.equals(binaryArray[i])) hex += hexStr.substring(i, i + 1); } for (int i = 0; i < binaryArray.length; i++) { if (b4.equals(binaryArray[i])) hex += hexStr.substring(i, i + 1); } return hex; } /** * 16进制指令list转换为byte[]指令 * * @param list 指令集 * @return byte[]指令 */ public static byte[] hexListToByte(List list) { ArrayList commandList = new ArrayList<>(); for (String hexStr : list) { commandList.add(hexStringToBytes(hexStr)); } int len = 0; for (byte[] srcArray : commandList) { len += srcArray.length; } byte[] destArray = new byte[len]; int destLen = 0; for (byte[] srcArray : commandList) { System.arraycopy(srcArray, 0, destArray, destLen, srcArray.length); destLen += srcArray.length; } return destArray; } /** * 16进制串转byte数组 * * @param hexString 16进制串 * @return byte数组 */ public static byte[] hexStringToBytes(String hexString) { if (hexString == null || hexString.equals("")) { return null; } hexString = hexString.toUpperCase(); int length = hexString.length() / 2; char[] hexChars = hexString.toCharArray(); byte[] d = new byte[length]; for (int i = 0; i < length; i++) { int pos = i * 2; d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); } return d; } /** * 16进制char 转 byte * * @param c char * @return byte */ private static byte charToByte(char c) { return (byte) hexStr.indexOf(c); } public static void main(String[] args) { } }