我有一个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。
答案 0 :(得分:1)
这是将字符串转换为浮点数的方法:
float myFloat = System.BitConverter.ToSingle(byteArray, startIndex);
您将首先将字符串转换为字节数组(类似于在C ++中创建空终止字节字符串的方式)。然后你可以应用上面的命令转换成float(又名Single)