Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中int到float的转换#_C#_Floating Point - Fatal编程技术网

C# c语言中int到float的转换#

C# c语言中int到float的转换#,c#,floating-point,C#,Floating Point,我有一个c#应用程序,可以打开一个文件并解析存储为ASCII十六进制值的二进制数据。我遇到的问题是将浮点数转换为字符串。在本例中,数字为14.25,字符串为“41640000”。我将文件中的字符串读取为本地字符串 String tmp = dlines[1].Substring( param_offset, param_size ); 因为没有接受ascii十六进制字符串的float.Parse方法,所以我将该字符串转换为整数 int itmp = int.Parse( tmp, System

我有一个c#应用程序,可以打开一个文件并解析存储为ASCII十六进制值的二进制数据。我遇到的问题是将浮点数转换为字符串。在本例中,数字为14.25,字符串为“41640000”。我将文件中的字符串读取为本地字符串

String tmp = dlines[1].Substring( param_offset, param_size );
因为没有接受ascii十六进制字符串的float.Parse方法,所以我将该字符串转换为整数

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;
    }
当ffrac=1.78128,pow=8?时,生成0.0000的值

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

这就是我所尝试的:

        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" ) );
还是不行

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


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

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

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

首先需要将字符串转换为字节数组(类似于在C++中创建空终止字节字符串的方式)。然后您可以应用上面的命令将其转换为浮点(也称为Single)

您能解释一下为什么14.25表示为(十六进制)41640000=(十进制)1097072640吗?现在还不清楚这种格式是什么意思。如果它是IEEE754表示,最好将二进制数据作为字节而不是整数处理。此时,BitConverter可能是您的朋友。float f=BitConverter.ToSingle(BitConverter.GetBytes(0x41640000),0);在回答上一个问题时,您的格式字符串应该是“{0:0.0000}”或“{0:F4}”,我检查了文档中的string.format()。那里什么都没有。使用“{0:F4}”生成输出“0:F4”。将格式更改为{0:0.0000}工作。BitConverter无法工作。答案是按照PaulF的建议,将我原来问题中的格式字符串更改为{0:0.0000}。
String: 41640000
Bytes:  0x41 0x64 0x0 0x0
Float:  0.0000
float myFloat = System.BitConverter.ToSingle(byteArray, startIndex);