我需要解析一个文件,直接用记事本打开是如下乱码://——-----------------------------------------------
?e ?e
鄮
]
]? ?en %€ %€ %€ ((((AT AT AT AT
]
//---------------------------------------------------
用UltraEdit打开可以看到如下://----------------UltraEdit打开第一行-------------------------------
00000000h: AC 10 65 0A 14 1E 03 FF FF FF FF 00 FF FF FF FF; ?.e.... .
//--------------------------------------------------
AC 10 65 0A 14 1E 03 FF FF FF FF 00 FF FF FF FF; 这段是 16 进制码 我试过用JAVA读,但是只能读出 ?.e.... . 而 00000000h: AC 10 65 0A 14 1E 03 FF FF FF FF 00 FF FF FF FF; 是读不出来的。把 AC 10 65 0A 翻译成10进制码为:172 16 101 10请问哪位大峡知道如何读出文件里面的内容 AC 10 65 0A 14 1E 03 FF FF FF FF 00 FF FF FF FF 然后把他翻译成 10进制的内容呢?分不够可以再加,只要有人能解决。
?e ?e
鄮
]
]? ?en %€ %€ %€ ((((AT AT AT AT
]
//---------------------------------------------------
用UltraEdit打开可以看到如下://----------------UltraEdit打开第一行-------------------------------
00000000h: AC 10 65 0A 14 1E 03 FF FF FF FF 00 FF FF FF FF; ?.e.... .
//--------------------------------------------------
AC 10 65 0A 14 1E 03 FF FF FF FF 00 FF FF FF FF; 这段是 16 进制码 我试过用JAVA读,但是只能读出 ?.e.... . 而 00000000h: AC 10 65 0A 14 1E 03 FF FF FF FF 00 FF FF FF FF; 是读不出来的。把 AC 10 65 0A 翻译成10进制码为:172 16 101 10请问哪位大峡知道如何读出文件里面的内容 AC 10 65 0A 14 1E 03 FF FF FF FF 00 FF FF FF FF 然后把他翻译成 10进制的内容呢?分不够可以再加,只要有人能解决。
关注ING
InputStreamReader ir = new InputStreamReader(KeyTest.class.getResourceAsStream("xxx"));
in = new BufferedReader(ir);
try {
char[] line = in.readLine().toCharArray();
System.out.println(line.length);
for(int l:line){
System.out.println(l);
}
} catch (IOException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}
这说明这个是不可显示的字符,
请问哪位大峡知道如何读出文件里面的内容 AC 10 65 0A 14 1E 03 FF FF FF FF 00 FF FF FF FF 然后把他翻译成 10进制的内容呢?
----------------------------------------------------------------------
直接读出行来,然后强制类型转化成int就行了.
指令地址(000000H):指令(AC 10 65 0A 14 1E 03 FF FF FF FF 00 FF FF FF FF;):前面对应的内存状态(?.e.... .)
所以一般来说,出现e这个字符只是一个偶然,当然如果你的Windows应用程序有定义某个内存为字符e,那就是必然了.例如:这是一个输出字符串的汇编程序:
DATA SEGMENT
STR DB 'THIS IS THE STR$' ;//分配一个内存块,内容是THIS IS THE STR
DATA ENDS
STACK SEGMENT
S DB 100 DUP(30H) ;在内存里设置100个值为字符串'0'的内存块.作为堆栈
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,09H
MOV DX,OFFSET STR
INT 21H ;//输出那个字符串
MOV AH,4CH
INT 21H
CODE ENDS
END START编译成exe文件后,用十六进制文件打开:部分如下
000200 54 48 49 53 20 49 53 20 54 48 45 20 53 54 52 24 THIS IS THE STR$
000210 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000
000220 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000
000230 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000
000240 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000
000250 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000
000260 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000
000270 30 30 30 30 30 30 30 30 00 00 00 00 00 00 00 00 0000............
000280 B8 00 00 8E D8 B4 09 BA 00 00 CD 21 B4 4C CD 21 ...........!.L.!
其中最后一排的!和L是偶然的,前面的字符和0就不是偶然的.
import java.io.*;
public class ReadHex {
public static void main(String[] args) throws Exception{
FileInputStream fis=new FileInputStream("C:/a.exe");
int counter=0;
int line=0;
int t=fis.read();
while(t!=-1){
if(counter==0){
System.out.print("\n地址:"+line+" ");
line++;
}
System.out.print(Integer.toHexString(t));
if(t<9) System.out.print("0");
System.out.print(" ");
t=fis.read();
counter++;
if(counter==16) counter=0;
} }}
结果:
地址:0 4d 5a 90 00 20 00 10 00 20 00 00 00 ff ff 00 00
地址:1 00 00 3b c7 00 00 80 00 1e 00 00 00 10 00 10 00
地址:2 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:3 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:5 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:7 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:9 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:19 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:22 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:23 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:25 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:26 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:28 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:29 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
地址:32 54 48 49 53 20 49 53 20 54 48 45 20 53 54 52 24
地址:33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
地址:34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
地址:35 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
地址:36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
地址:37 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
地址:38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
地址:39 30 30 30 30 00 00 00 00 00 00 00 00 00 00 00 00
地址:40 b8 00 00 8e d8 b4 9 ba 00 00 cd 21 b4 4c cd 21
public class ReadHex {
public static void main(String[] args) throws Exception{
FileInputStream fis=new FileInputStream("C:/a.exe");
int counter=0;
int line=0;
int t=fis.read();
while(t!=-1){
if(counter==0){
System.out.print("\n地址:"+line+" ");
line++;
}
if(t<9) System.out.print("0");//应该把这一句放在前面,如果你想要int型,t就是你想要的
System.out.print(Integer.toHexString(t));
System.out.print(" ");
t=fis.read();
counter++;
if(counter==16) counter=0;
}
}
}