注:之前有使用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。