DumpHex macro for jEdit

22 views
Skip to first unread message

pi1ot

unread,
Oct 18, 2012, 4:21:19 AM10/18/12
to jedi...@googlegroups.com
因为对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 );
}


屏幕快照 2012-10-18 下午3.02.50.png
Reply all
Reply to author
Forward
0 new messages