如何实现读取以txt文本文件存储的16进制数据,并将其转换成10进制数据输出?数据如下,(注:每四个数字为一个16进制数据,即0958是一个16进制数据,0437是一个16进制数据,07AF是一个16进制数据。)由于项目需要,希望大侠早日垂怜帮助,万分感谢!
09 58 04 37 07 AF 09 35 00 5C 20 00 06 4A 07 2D 09 57 04 37 07 B0 08 DB 00 5C 20 00 06 B8 07 7D 09 56 04 37 07 B0 08 9F 00 5C 20 00 07 1C 07 C2 09 56 04 37 07 AF 08 79 00 5C 20 00 07 76 07 FD 09 56 04 37 07 AF 08 5F 00 5C 20 00 07 C1 08 2F 09 58 04 37 07 B0 08 5A 00 5C 20 00 08 04 08 17 09 58 04 37 07 AF 08 55 00 5C 20 00 08 35 08 0D 09 58 04 37 07 AF 08 52 00 5C 20 00 08 61 08 07 09 58 04 38 07 AF 08 4F 00 5C 20 00 08 84 08 07 09 58 04 38 07 AF 08 4D 00 5C 20 00 08 A3 08 0B 09 59 04 38 07 B0 08 4B 00 5C 20 00 08 BD 08 10 09 59 04 37 07 AF 08 4A 00 5C 20 00 08 D5 08 16 09 58 04 38 07 AF 08 49 00 5C 20 00 08 E7 08 1C 09 58 04 38 07 AF 08 49 00 5C 2008 50 09 59 04 3A 07 B0 08 4A 00 5C 20 00 09 36 08 50 09 58 04 3A 07 AF 08 4A 00 5C 20 00 09 36 08 50 09 58 04 3A 07 AF 08 49 00 5C 20 00 09 35 08 4E 09 58 04 3A 07 AF 08 47 00 5C 20 00 09 34 08 4C 09 59 04 3B 07 AF 08 47 00 5C 20 00 09 33 08 4B 09 58 04 3B 07 AF 08 48 00 5C 20 00 09 33 08 4C 09 58 04 3B 07 AF 08 4A 00 5C 20 00 09 36 08 4E 09 59 04 3B 07 AF 08 4B 00 5C 20 00 09 38 08 52 09 59 04 3B 07 AF 08 4E 00 5C 20 00 09 3B 08 55 09 58 04 3B 07 AF

解决方案 »

  1.   

    谢谢楼上,你这个方法是实现16进制与十进制的转换吧,我现在的问题是我用InputStreamReader()和BufferedReader()方法或者直接用read()方法读取数据的时候和文本数据有偏差,是不是需要其他I/O方法啊?请赐教!!!此问题的关键是如何读取这个文本文件。
      

  2.   


    public class DiskTest {
        public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
            File file = new File("D:\\ComRcvData2.txt");
            byte[] content=readFile(file);
            System.out.println(content);
            writeBytes("D:\\ComRcvData1.txt",content);
        }    /** *//**读文件到字节数组
         * @param file
         * @return
         * @throws Exception
         */
        static byte[] readFile(File file) throws   Exception {
            if (file.exists() && file.isFile()) {
                long fileLength = file.length();
                if (fileLength > 0L) {
                    BufferedInputStream fis = new BufferedInputStream(
                            new FileInputStream(file));
                    byte[] b = new byte[(int) fileLength];
                    while (fis.read(b)!= -1) {
                     for (int j = 0; j < b.length; j++) {
    System.out.println(b[j]);
    }
                    }
                    fis.close();
                    fis = null;                return b;
                }
            } else {
                return null;
            }
            return null;
        }    /** *//**将字节数组写入文件
         * @param filePath
         * @param content
         * @return
         * @throws IOException
         */
        static boolean writeBytes(String filePath, byte[] content)
                throws IOException {
            File file = new File(filePath);
            synchronized (file) {
                BufferedOutputStream fos = new BufferedOutputStream(
                        new FileOutputStream(filePath));
                fos.write(content);
                fos.flush();
                fos.close();
            }
            return true;    }
    }
      

  3.   

    一个byte就是一个字符.过滤不是16进制的字符.如:空格,换行,其他等.构造一个byte[4]数组转化成字符串.调用Integer.parseInt("", 16).
    如:
    byte b = -1;
    byte[] data = new byte[4];
    while((b = (byte)input.read()) != -1){
    if(!' '== b && !'\r'== b && !'\n'==b && i<4){
      data[i] = b;
      i++;
    }
    if(i==4){
    String dataStr = new String(data);
    int dataInt = Integer.parseInt(dataStr, 16);
    i=0;
    }
    }
      

  4.   

    感谢楼上,你看我理解你的意思对不对,Integer.parseInt只可以对字符串进行转化,所以我们不能一个字符一个字符的读。但是我的问题不是这个,我也可以用一些方法读取字符串啊,如下:
    FileInputStream fis = new FileInputStream(fileChooser.getSelectedFile().getAbsolutePath());
    InputStreamReader isr = new InputStreamReader(fis);
    BufferedReader bf = new BufferedReader(isr);
    String line = "";
    int row = 0;
    while ((line = bf.readLine()) != null) {
    String[] data = line.split(" ");
    但是我读出来用system.out.println()输出看了下与自己文本文件显示的不一样啊,
    我们先不说以十进制输出了,能不能实现读取的内容就是文本显示的内容呢?
      

  5.   

    sorry 各位,问题重新说明一下,我发现自己问题所在了。我的数据太大了,文本文件是2mb,我从中截取了一段数据是可以正常读取并转化为十进制的。现在我重新阐述自己的问题,我有一文本存储的十六进制数据,请问如何读取数据量超大的这一txt文件??数据格式如下:
    37 07 AF 08 55 00 5C 20 00 08 35 08 0D 09 58 04 37 07 AF 08 52 00 5C 20 00 08 61 08 07 09 58 04 38 07 AF 08 4F 00 5C 20 00 08 84 08 07 09 58 04 38 07 AF 08 4D 00 5C 20 00 08 A3 08 0B 09 59 04 38 07 B0 08 4B 00 5C 20 00 08 BD 08 10 09 59 04 37 07 AF 08
    其中 3707是一个十六进制数,AF08是一个十六进制数,一次类推。 

      

  6.   

    不对.看来你还要多学习.
    FileInputStream fis = new FileInputStream(fileChooser.getSelectedFile().getAbsolutePath());
    InputStreamReader isr = new InputStreamReader(fis);
    BufferedReader bf = new BufferedReader(isr);
    String line = "";
    int row = 0;
    while ((line = bf.readLine()) != null) {
    String[] data = line.split(" ");
    能读出文件内容.如不能正常显示就是你文件的编码与你读取的编码不一致.
      

  7.   

    呵呵,LG说的太对了,我来这里就是向各位学习的。不过我越来越糊涂了,looking-glass的while循环里本身好像就存在错误啊,b = (byte)input.read())这个好像不能直接就强制转换吧?我在eclipse敲入以下代码好多错误报出啊
    while((b = (byte)input.read()) != -1){
    if(!' '== b && !'\r'== b && !'\n'==b && i<4){
      data[i] = b;
      i++;
    }
    诚然,我也怀疑是编码格式的问题,因为我新建txt然后从原文件copy出来部分数据,正常读取;
    但是我全部copy过来就不能正常读取了。所以我怀疑不是文件数据太大就是格式问题。注:read和readline方法我都用过了。
      

  8.   

    文本文件存储一般可以分为ascii和unicode。
    我的方法只能使用与ascii吗。对于unicode编码的因为是使用变长存储。这时文件一个字节就不能代表一个字符。
    个人认为对于对于unicode的编码还是先转化成ascii吗比较好处理。
    还有一点要注意的是:在java内存中字符串都是以unicode编码存放。ps:我的方法是我的写的伪代码。
    应该改为
    if(' '!= b && '\r'!= b && !'\n'!=b ).转化方法很多:
    最好的方法个人认为:
    InputStreamReader isr = new InputStreamReader(fis, "对应的文件编码");
    BufferedReader bf = new BufferedReader(isr);
    然后一行读取,得到行之后调用getBytes("gbk"),然后byte再转入宁外的文件就可以实现转化。
      

  9.   

    不单单是这个问题,数据量太大了,其他人说可能是Java内存问题
    http://topic.csdn.net/u/20110715/09/86845f38-0ab8-4f4e-8c0f-870762bd9476.html