因为对jedit plugin列表里现有的hex、hexedit、hextools插件功能不太习惯,故写了下面这个简化版的macro,代码参照了jedit自带macro:hex convert
63 68 61 72 5B 5D 20 68 65 78 5F 64 69 67 69 74 20 3D 20 | char[] hex_digit =
6E 65 77 20 63 68 61 72 5B 5D 20 7B 0A 20 20 20 20 27 30 | new char[] { '0
27 2C 20 27 31 27 2C 20 27 32 27 2C 20 27 33 27 2C 20 27 | ', '1', '2', '3', '
34 27 2C 20 27 35 27 2C 20 27 36 27 2C 20 27 37 27 2C 0A | 4', '5', '6', '7',
20 20 20 20 27 38 27 2C 20 27 39 27 2C 20 27 41 27 2C 20 | '8', '9', 'A',
27 42 27 2C 20 27 43 27 2C 20 27 44 27 2C 20 27 45 27 2C | 'B', 'C', 'D', 'E',
20 27 46 27 0A 7D 3B 0A 0A 53 74 72 69 6E 67 20 62 79 74 | 'F' }; String byt
65 5F 74 6F 5F 68 65 78 28 20 62 79 74 65 20 62 20 29 20 | e_to_hex( byte b )
7B 0A 20 20 20 20 63 68 61 72 5B 5D 20 63 68 61 72 73 20 | { char[] chars
3D 20 6E 65 77 20 63 68 61 72 5B 5D 20 7B 0A 20 20 20 20 | = new char[] {
20 20 20 20 68 65 78 5F 64 69 67 69 74 5B 20 28 62 20 3E | hex_digit[ (b >
3E 20 34 29 20 26 20 30 78 30 66 20 5D 2C 0A 20 20 20 20 | > 4) & 0x0f ],
20 20 20 20 68 65 78 5F 64 69 67 69 74 5B 20 62 20 26 20 | hex_digit[ b &
30 78 30 66 20 5D 0A 20 20 20 20 7D 3B 0A 20 20 20 20 72 | 0x0f ] }; r
65 74 75 72 6E 20 6E 65 77 20 53 74 72 69 6E 67 28 20 63 | eturn new String( c
68 61 72 73 20 29 3B 0A 7D 0A 0A 53 74 72 69 6E 67 20 64 | hars ); } String d
75 6D 70 5F 68 65 78 28 20 53 74 72 69 6E 67 20 74 61 72 | ump_hex( String tar
67 65 74 20 29 20 7B 0A 20 20 20 20 62 79 74 65 5B 5D 20 | get ) { byte[]
73 74 72 69 6E 67 20 3D 20 74 61 72 67 65 74 2E 67 65 74 | string = target.get
42 79 74 65 73 28 29 3B 0A 20 20 20 20 53 74 72 69 6E 67 | Bytes(); String
42 75 66 66 65 72 20 68 65 78 20 3D 20 6E 65 77 20 53 74 | Buffer hex = new St
72 69 6E 67 42 75 66 66 65 72 28 29 3B 0A 0A 20 20 20 20 | ringBuffer();
69 6E 74 20 74 61 69 6C 20 3D 20 30 3B 0A 20 20 20 20 53 | int tail = 0; S
74 72 69 6E 67 20 73 72 63 20 3D 20 22 22 3B 0A 20 20 20 | tring src = "";
20 69 6E 74 20 6C 65 6E 67 74 68 20 3D 20 73 74 72 69 6E | int length = strin
67 2E 6C 65 6E 67 74 68 3B 0A 09 66 6F 72 20 28 20 69 6E | g.length; for ( in
74 20 69 3D 30 3B 20 69 3C 6C 65 6E 67 74 68 3B 20 2B 2B | t i=0; i<length; ++
69 20 29 20 7B 0A 09 09 0A 09 09 63 68 61 72 20 63 75 72 | i ) { char cur
72 20 3D 20 73 74 72 69 6E 67 5B 69 5D 3B 0A 09 09 69 66 | r = string[i]; if
20 28 20 63 75 72 72 20 3D 3D 20 27 5C 72 27 20 7C 7C 20 | ( curr == '\r' ||
63 75 72 72 3D 3D 27 5C 6E 27 20 7C 7C 20 63 75 72 72 3D | curr=='\n' || curr=
3D 27 5C 74 27 20 29 20 7B 0A 09 09 09 73 72 63 20 2B 3D | ='\t' ) { src +=
20 22 20 22 3B 0A 09 09 7D 20 65 6C 73 65 20 7B 0A 09 09 | " "; } else {
09 73 72 63 20 2B 3D 20 63 75 72 72 3B 0A 09 09 7D 0A 09 | src += curr; }
09 0A 09 09 68 65 78 2E 61 70 70 65 6E 64 28 20 62 79 74 | hex.append( byt
65 5F 74 6F 5F 68 65 78 28 73 74 72 69 6E 67 5B 69 5D 29 | e_to_hex(string[i])
20 2B 20 22 20 22 20 29 3B 0A 09 09 69 66 20 28 20 28 28 | + " " ); if ( ((
69 2B 31 29 25 31 39 29 20 3D 3D 20 30 20 29 20 7B 0A 09 | i+1)%19) == 0 ) {
09 09 68 65 78 2E 61 70 70 65 6E 64 28 20 22 20 7C 20 22 | hex.append( " | "
20 2B 20 73 72 63 20 2B 20 22 5C 6E 22 20 29 3B 0A 09 09 | + src + "\n" );
09 73 72 63 20 3D 20 22 22 3B 0A 09 09 09 74 61 69 6C 20 | src = ""; tail
3D 20 31 3B 0A 09 09 7D 20 65 6C 73 65 20 7B 0A 09 09 09 | = 1; } else {
74 61 69 6C 20 3D 20 30 3B 0A 09 09 7D 0A 20 20 20 20 7D | tail = 0; } }
0A 20 20 20 20 0A 20 20 20 20 69 66 20 28 20 74 61 69 6C | if ( tail
3D 3D 30 20 26 26 20 73 72 63 21 3D 22 22 20 29 20 7B 0A | ==0 && src!="" ) {
20 20 20 20 09 69 6E 74 20 61 6C 69 67 6E 20 3D 20 31 39 | int align = 19
20 2D 20 73 72 63 2E 6C 65 6E 67 74 68 28 29 3B 0A 20 20 | - src.length();
20 20 09 53 74 72 69 6E 67 20 62 6C 61 6E 6B 20 3D 20 22 | String blank = "
22 3B 0A 20 20 20 20 09 66 6F 72 20 28 20 69 6E 74 20 69 | "; for ( int i
3D 30 3B 20 69 3C 61 6C 69 67 6E 3B 20 2B 2B 69 20 29 20 | =0; i<align; ++i )
7B 0A 20 20 20 20 09 09 62 6C 61 6E 6B 20 2B 3D 20 22 20 | { blank += "
20 20 22 3B 0A 20 20 20 20 09 7D 0A 20 20 20 20 09 68 65 | "; } he
78 2E 61 70 70 65 6E 64 28 20 62 6C 61 6E 6B 20 2B 20 22 | x.append( blank + "
20 7C 20 22 20 2B 20 73 72 63 20 29 3B 0A 20 20 20 20 7D | | " + src ); }
0A 20 20 20 20 0A 20 20 20 20 72 65 74 75 72 6E 20 68 65 | return he
78 2E 74 6F 53 74 72 69 6E 67 28 29 3B 0A 7D 0A 0A 53 74 | x.toString(); } St
72 69 6E 67 20 74 65 78 74 20 3D 20 74 65 78 74 41 72 65 | ring text = textAre
61 2E 67 65 74 53 65 6C 65 63 74 65 64 54 65 78 74 28 29 | a.getSelectedText()
3B 0A 69 66 20 28 20 74 65 78 74 3D 3D 6E 75 6C 6C 20 7C | ; if ( text==null |
7C 20 74 65 78 74 3D 3D 22 22 20 29 20 7B 0A 09 74 65 78 | | text=="" ) { tex
74 41 72 65 61 2E 73 65 6C 65 63 74 41 6C 6C 28 29 3B 0A | tArea.selectAll();
09 74 65 78 74 20 3D 20 74 65 78 74 41 72 65 61 2E 67 65 | text = textArea.ge
74 53 65 6C 65 63 74 65 64 54 65 78 74 28 29 3B 0A 09 74 | tSelectedText(); t
65 78 74 41 72 65 61 2E 73 65 6C 65 63 74 4E 6F 6E 65 28 | extArea.selectNone(
29 3B 0A 7D 0A 69 66 20 28 20 74 65 78 74 20 21 3D 20 6E | ); } if ( text != n
75 6C 6C 20 29 20 7B 0A 09 53 74 72 69 6E 67 20 68 65 78 | ull ) { String hex
20 3D 20 64 75 6D 70 5F 68 65 78 28 20 74 65 78 74 20 29 | = dump_hex( text )
3B 0A 09 6E 65 77 62 75 66 20 3D 20 6A 45 64 69 74 2E 6E | ; newbuf = jEdit.n
65 77 46 69 6C 65 28 20 76 69 65 77 20 29 3B 0A 09 6E 65 | ewFile( view ); ne
77 62 75 66 2E 69 6E 73 65 72 74 28 20 30 2C 20 68 65 78 | wbuf.insert( 0, hex
20 29 3B 0A 7D 0A | ); }
char[] hex_digit = new char[] {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};
String byte_to_hex( byte b ) {
char[] chars = new char[] {
hex_digit[ (b >> 4) & 0x0f ],
hex_digit[ b & 0x0f ]
};
return new String( chars );
}
String dump_hex( String target ) {
byte[] string = target.getBytes();
StringBuffer hex = new StringBuffer();
int tail = 0;
String src = "";
int length = string.length;
for ( int i=0; i<length; ++i ) {
char curr = string[i];
if ( curr == '\r' || curr=='\n' || curr=='\t' ) {
src += " ";
} else {
src += curr;
}
hex.append( byte_to_hex(string[i]) + " " );
if ( ((i+1)%19) == 0 ) {
hex.append( " | " + src + "\n" );
src = "";
tail = 1;
} else {
tail = 0;
}
}
if ( tail==0 && src!="" ) {
int align = 19 - src.length();
String blank = "";
for ( int i=0; i<align; ++i ) {
blank += " ";
}
hex.append( blank + " | " + src );
}
return hex.toString();
}
String text = textArea.getSelectedText();
if ( text==null || text=="" ) {
textArea.selectAll();
text = textArea.getSelectedText();
textArea.selectNone();
}
if ( text != null ) {
String hex = dump_hex( text );
newbuf = jEdit.newFile( view );
newbuf.insert( 0, hex );
}