Java实现将16进制转10进制浮点型输出到文件中

注:之前有使用c语言将16进制dat文件转换为16进制的txt文件,现在使用16进制的txt文件进行转换

package text;

public class DataConversion {
	 /**
	     * 将指定字符串src,以每两个字符分割转换为16进制形式 如:"2B44EFD9" –> byte[]{0x2B, 0×44, 0xEF,
	     * 0xD9}
	     *
	     * @param src
	     *            String
	     * @return byte[]
	     */
	    public static byte[] HexString2Bytes(String src) {
	        if (null == src || 0 == src.length()) {
	            return null;
	        }
	        byte[] ret = new byte[src.length() / 2];
	        byte[] tmp = src.getBytes();
	        for (int i = 0; i < (tmp.length / 2); i++) {
	            ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
	        }
	        return ret;
	    }
	    public static byte uniteBytes(byte src0, byte src1) {
	    	byte _b0 = Byte.decode("0x" + new String(new byte[] {src0})).byteValue();
	    	_b0 = (byte) (_b0 << 4);
	    	byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 })).byteValue();
	    	byte ret = (byte) (_b0 ^ _b1);
	    	return ret;
	    	}
	}

package text;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.NumberFormat;
import java.util.ArrayList;


public class HexConvertUtil {
	
	ArrayList list =new ArrayList();
    public  Float HexConvertToString(String hex) throws IOException {
        byte[] bytes = DataConversion.HexString2Bytes(hex);
        DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(bytes));
        float value = dataInputStream.readFloat();
//        System.out.println("转换后数字:" + value);
//        System.out.println(value < 0);
        return value;
    }
    
    public ArrayList ReadFile() throws IOException{
    	FileInputStream filestream=new FileInputStream("C:/Users/yf/Documents/Visual Studio 2010/Projects/test111/test111/2s.txt");
    	String fileName="C:/Users/yf/Documents/Visual Studio 2010/Projects/test111/test111/float2.txt";
    	InputStreamReader readStream=new InputStreamReader(filestream);
        BufferedReader reader=new BufferedReader(readStream);
        
        OutputStreamWriter os = null;
        FileOutputStream fos = null;
        
        try {
            fos = new FileOutputStream(fileName);
            os = new OutputStreamWriter(fos, "UTF-8");
            
        } catch (Exception ex) {
            ex.printStackTrace();
        } 
        String temp=null;
        int line=0;//行号
        String ac=null;
        while((temp=reader.readLine())!=null){
            line++;
//            System.out.println(line+":"+temp);
            if(temp.length()==8){
            //这个操作是因为我的16进制是右边高位 然后代码实现的是左边高位我在这里进行了修改
            	ac =temp.substring(6,8)+temp.substring(4,6)+ temp.substring(2,4)+temp.substring(0,2);
            }
            else{
            	if (os != null) {
                    os.close();
                    os = null;
                }
                if (fos != null) {
                    fos.close();
                    fos = null;
                }
            	return list;
            }
            
//            System.out.println(ac);
        	float a = HexConvertToString(ac);
        	String aa =Float.toString(a);
        	os.write(aa);//将值写入文件中
        	list.add(a);//将值存入数组
        	os.write("\n");
            System.out.println(a);
        }
        
        if (os != null) {
            os.close();
            os = null;
        }
        if (fos != null) {
            fos.close();
            fos = null;
        }
    	return list;
    }
    
    public void cal(float avg,ArrayList lista){
    //这里是对每一个数据根据平均值求百分比的操作  只做测试起名随机
    	float ces=0;
    	float avga = avg;
    	int a2=0;
    	int a5=0;
    	int a10 = 0;
    	int a100 =0;
    	int b2=0;
    	int b5=0;
    	int b10 = 0;
    	int b100 =0;
    	for( int i = 0 ; i < lista.size() ; i++) {//内部不锁定,效率最高,但在多线程要考虑并发操作的问题。
    		ces = (Float) lista.get(i);
    		// 创建一个数值格式化对象
            NumberFormat numberFormat = NumberFormat.getInstance();
            // 设置精确到小数点后2位
            numberFormat.setMaximumFractionDigits(2);
            String result = numberFormat.format( ces /  avga * 100);
            float flo = Float.parseFloat(result);
            float bai = 100;
            float cha = flo-bai;
            //这里是要求做一个统计每个数占比 ,然后做正负直方图。
            if((cha<=2)&&(cha>0)){//大于正负百分之2
            	a2++;
            }else if((cha>2)&&(cha<=5)){//大于正负2到正负5
            	a5++;
            }else if((cha>5)&&(cha<=10)){//大于正负5到正负10
            	a10++;
            }else if(cha>10){//大于正负10
            	a100++;
            }else if((cha>=(-2))&&(cha<0)){
            	b2++;
            }else if((cha>=(-5))&&(cha<(-2))){
            	b5++;
            }else if((cha>=(-10))&&(cha<(-5))){
            	b10++;
            }else if(cha<(-10)){
            	b100++;
            }
    	}
    	System.out.println("a:"+a2+"  "+a5+"   "+a10+"   "+a100);
    	System.out.println("b:"+b2+"  "+b5+"   "+b10+"   "+b100);
    }
    
    
    
    public static void main(String[] args) throws IOException {
    	HexConvertUtil he = new HexConvertUtil();//创建对象
    	ArrayList lista  = he.ReadFile();//创建一个接收的list
    	int num = 0;
    	float sum = 0;
    	for( int i = 0 ; i < lista.size() ; i++) {//内部不锁定,效率最高,但在多线程要考虑并发操作的问题。
    		sum+=(Float) lista.get(i);
    	    num++;
    	}
    	float avg = sum/num;
    	System.out.println(sum+"/"+num+"="+avg);//求平均值
    	he.cal(avg,lista);
    	
//    	float a = he.HexConvertToString("2ef6a2e5");
//    	System.out.println(a);
    	
	}
    
  
    
    
}

上面代码都可以运行成功,另记录一下:使用UE打开的.dat文件需要使用16进制显示,我一直以为文件就是16进制格式的,但实际上,文件中记录的是一个值的地址 ,16进制显示的是地址,而用文本打开的都是乱码。

附上使用c语言将16进制转txt文件显示的链接附上
c语言将16进制转txt文件显示

此文件也经过测试成功,使用VS2010。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值