C# c语言中int到float的转换#
我有一个c#应用程序,可以打开一个文件并解析存储为ASCII十六进制值的二进制数据。我遇到的问题是将浮点数转换为字符串。在本例中,数字为14.25,字符串为“41640000”。我将文件中的字符串读取为本地字符串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
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);