本帖最后由 zhw933 于 2009-11-03 17:02:32 编辑

解决方案 »

  1.   


    public class TestFloat {
    public static byte[] convertHexStringToBytes(String buff) throws Exception {
    try { buff = buff.replaceAll("\n", " ");
    StringTokenizer st = new StringTokenizer(buff, " ");
    int size = st.countTokens();
    ByteBuffer bb = ByteBuffer.allocate(size);
    while (st.hasMoreTokens()) {
    buff = st.nextToken();
    int c = Character.digit(buff.charAt(0), 16) << 4;
    c = c + Character.digit(buff.charAt(1), 16);
    bb.put((byte) c);
    }
    return bb.array();
    } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
    throw new Exception("read file error");
    }
    }

    public static void main(String args[]) throws Exception{
    byte[] b = TestFloat.convertHexStringToBytes("cd cc cc 3e");
    ByteBuffer bb = ByteBuffer.wrap(b);
    bb.order(ByteOrder.LITTLE_ENDIAN);
    float f  = bb.getFloat();
    System.out.println(f);

    }
    }
    想了个蠢办法
      

  2.   

    我以前写的int,long与byte数组互相转换的代码,你看下,应该是差不多的。
    Int型和byte数组,以及long型和byte数组之间的相互转换
      

  3.   

    写了一个解析IEEE754浮点数二进制的代码:import java.util.*;
    public class Hex2Float{
       public static int getInt(char ch){
      if(ch>='0' && ch<= '9')return ch-='0';
      if(ch>='a' && ch<= 'z')ch-=32;
      if(ch<'A' || ch> 'Z')throw new RuntimeException("参数不合法!");
          switch(ch){
      case 'A':return 10;
      case 'B':return 11;
      case 'C':return 12;
      case 'D':return 13;
      case 'E':return 14;
      case 'F':return 15;
      }
      return 0;
       }
       public static char[] str2BitArray(String str){
           char chs[]=str.toCharArray();
       char bits[]=new char[chs.length*4];
       int index=0;
       for(int i=0;i<chs.length;i++){
            for(int j=3;j>=0;j--){
        if(((1<<j)&getInt(chs[i]))!=0){
        bits[index++]='1';
    }else bits[index++]='0';
    }
       }
       System.out.println(Arrays.toString(bits));
       return bits;
       }
       public static int parseSign(char ch[]){
           return (ch[0]=='1'?-1:1);
       }
       public static int parseExponent(char ch[]){
           int result=0;
           for(int i=1;i<=8;i++){
           result+=(ch[i]-'0')*Math.pow(2,8-i);
       }
       //System.out.println(result);
           return result;
       }
       public static double parseEnding(char[] ch){
           double result=0;
           for(int i=9;i<=31;i++){
           result+=(ch[i]-'0')*Math.pow(0.5,i-8);
       }
       //System.out.println(result);
           return result;
       }
       public static float getFloat(String str){
           char[] bits=str2BitArray(str);
       int sign=parseSign(bits);
       int e=parseExponent(bits);
       double m=parseEnding(bits);
       System.out.println("sign="+sign+",e="+e+",m="+m);
       if(e==0 && m==0){
           return 0;
       }else if((e==0) && (m!=0)){
           return (float)(sign*Math.pow(2.0,-126)*m);
       }else if(e>=1 && e<=254 && m!=0){
           return (float)(sign*Math.pow(2.0,e-127)*(1+m));
       }else if((e==255) && m!=0){
           if((sign==1) && (m==0.5))return Float.NaN;
       else if((sign==1) && (m==0))return Float.NEGATIVE_INFINITY;
           else return Float.POSITIVE_INFINITY;
       }
       return 0;
       }
       public static void main(String rags[]){
       String str="3ecccccd";
       float f=getFloat(str);
       System.out.println("f="+f);
       }
    }
      

  4.   

    float转化成16进制很简单:float d=0.4f;
    System.out.println(Integer.toString(Float.floatToIntBits(d),16));
      

  5.   

    java类库应该有直接的方法,记不清了麻烦点的话可以用jni调用C函数实现
    union int2float
    {
       int intValue;
       float floatValue;
    };对一个赋值,使用另一个读出来即可。
      

  6.   

    谢谢2楼我要的就是这句
    bb.order(ByteOrder.LITTLE_ENDIAN);