c#

时间:2018-01-04 17:02:13

标签: c# floating-point

我有一个c#app打开一个文件并解析存储为ASCII Hex值的二进制数据。我遇到的问题是将浮点数转换为字符串。在这种情况下,数字是14.25,字符串是“41640000”。我将文件中的字符串读取为本地字符串。

String tmp = dlines[1].Substring( param_offset, param_size );

由于没有float.Parse方法接受ascii十六进制字符串,我将字符串转换为整数。

int itmp = int.Parse( tmp, System.Globalization.NumberStyles.HexNumber );

进行演员表只会产生一个非常大的数字:

float ftmp = (float)itmp;

所以我写了一个函数来进行转换。但它没有产生正确的结果。

        static float ToFloat( int i )
    {
        int sign, exp, frac, interim;
        float ffrac, pow;

        sign = (i < 0) ? -1:1;
        int pos = i * sign; // Convert to positive number.
        interim = pos >> 23;
        Console.WriteLine( "Int: 0x{0:x}, Pos: 0x{1:x}, Intr: {2}", i, pos, interim );
        exp  = interim - 127;
        frac = pos & 0x007fffff;
        ffrac = (frac / (float)8388608.0) + 1;
        pow = (float)Math.Pow( 2, exp );
        //string buf = String.Format( "0.0000", (((frac / 8388608.0) + 1.0) * Math.Pow( 2, exp )) );
        string buf = String.Format( "0.0000", ( ffrac * pow ) );
        float result = (float)(((frac / 8388608) + 1) * Math.Pow( 2, exp ));
        Console.WriteLine( "FloatValue: {0}, {1}, {2}, Exp: {3}, Pow: {4}", result.ToString ("0.0000" ), buf, ffrac, exp, pow );
        return result * sign;
    }

输出是:     Int:0x41640000,Pos:0x41640000,Intr:130,     FloatValue:8.0000,0.0000,1.78125,Exp:3,Pow:8

在上面的函数中,这一行是怎么回事:

string buf = String.Format( "0.0000", ( ffrac * pow ) );
当ffrac = 1.78128时,

产生的值为0.0000,而pow = 8?

=============================================== =============

这就是我的尝试:

        String stmp = tmp.Substring( index, 8 ); //, System.Globalization.NumberStyles.HexNumber );
        byte[] barray = new byte[4];
        for ( byte b = 0, c=0; b < 4; b++, c += 2 )
        {
            barray[b]  = (byte)(FromHex( stmp[c] ) << 4);
            barray[b] |= FromHex( stmp[c+1] );
        }
        Console.WriteLine( "String: {0}", stmp );
        Console.WriteLine( "Bytes: 0x{0:x} 0x{1:x} 0x{2:x} 0x{3:x}", barray[0], barray[1], barray[2], barray[3] );
        ftmp = BitConverter.ToSingle( barray, 0 );
        Console.WriteLine( "Float: {0}", ftmp.ToString( "0.0000" ) );

输出结果为:

String: 41640000
Bytes:  0x41 0x64 0x0 0x0
Float:  0.0000

仍然无效。

=============================================== ================ “你能解释为什么14.25表示为(十六进制)41640000 =(十进制)1097072640?”

14.25的十进制值以二进制表示,符合IEEE 754规范的0x41640000。

1 个答案:

答案 0 :(得分:1)

这是将字符串转换为浮点数的方法:

float myFloat = System.BitConverter.ToSingle(byteArray, startIndex);

您将首先将字符串转换为字节数组(类似于在C ++中创建空终止字节字符串的方式)。然后你可以应用上面的命令转换成float(又名Single)