int在c#中浮动转换[重复]

问题描述 投票:-1回答:1

这个问题在这里已有答案:

我有一个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?”

根据IEEE 754规范,14.25的十进制值以二进制表示为0x41640000。

c# floating-point
1个回答
1
投票

这是如何将字符串转换为浮点数:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.