C#/ .net可以从字符串中解析指数十六进制编码的浮点数吗?
C ++,Java都在语言的语法中包含[ - ] 0xh.hhhhp +/- d格式,其他语言(如python和C99)也支持解析这些字符串(float.fromhex,scanf)。
我还没有找到一种在C#中使用.NET库解析这个精确的十六进制编码指数格式的方法。
有没有一种好的方法来处理这个问题,还是一个体面的替代编码? (十进制编码不准确)。
示例字符串:0x1p-8 -0xfe8p-12
谢谢
不幸的是,我不知道任何内置于.NET的方法与Python的float.fromhex()相比。 所以我想你唯一能做的就是在C#中自己编写.fromhex()。 这项任务的难度可能从“有点容易”到“非常困难”,具体取决于您希望解决方案的完善程度和优化程度。
正式的,IEEE 754规范允许十六进制系数内的小数(即0xf.e8p-12),这为我们增加了一层复杂性,(对我来说很沮丧).NET也不支持Double.Parse()用于十六进制字符串。
如果您可以将问题限制为您提供的只有整数作为系数的示例,则可以使用字符串操作使用以下解决方案:
public static double Parsed(string hexVal)
{
int index = 0;
int sign = 1;
double exponent = 0d;
//Check sign
if (hexVal[index] == '-')
{
sign = -1;
index++;
}
else if (hexVal[index] == '+')
index++;
//consume 0x
if (hexVal[index] == '0')
{
if (hexVal[index+1] == 'x' || hexVal[index+1] == 'X')
index += 2;
}
int coeff_start = index;
int coeff_end = hexVal.Length - coeff_start;
//Check for exponent
int p_index = hexVal.IndexOfAny(new char[] { 'p', 'P' });
if (p_index == 0)
throw new FormatException("No Coefficient");
else if (p_index > -1)
{
coeff_end = p_index - index;
int exp_start = p_index + 1;
int exp_end = hexVal.Length;
exponent = Convert.ToDouble(hexVal.Substring(exp_start, exp_end - (exp_start)));
}
var coeff = (double)(Int32.Parse(hexVal.Substring(coeff_start, coeff_end), NumberStyles.AllowHexSpecifier));
var result = sign * (coeff * Math.Pow(2, exponent));
return result;
}
如果你正在寻找与Python的fromhex()相同的函数,你可以尝试将CPython实现转换为C#,如果你愿意的话。 我试了一下,但是因为我对标准不是很熟悉,并且遇到了所有的溢出检查,所以他们一直在寻找。 他们还允许其他的东西,如无限的前导和尾随空白,这是我的解决方案不允许的。
我的解决方案是“有点容易”的解决方案。 我猜如果你真的知道你的东西,你可以在比特级上建立符号,指数和尾数,而不是把所有东西都放大。 你也可以一次完成,而不是使用.Substring()方法作弊。
希望这至少能让你走上正轨。
我已经编写了C#代码,用于格式化和解析IEEE 754r中描述的并且由C99,C ++ 11和Java支持的十六进制浮点格式的数字。 该代码是F#BSD许可的FParsec库的一部分,并包含在单个文件中:https://bitbucket.org/fparsec/main/src/tip/FParsecCS/HexFloat.cs
支持的格式在http://www.quanttec.com/fparsec/reference/charparsers.html#members.floatToHexString中有所描述
测试代码(用F#编写)可以在https://bitbucket.org/fparsec/main/src/tip/Test/HexFloatTests.fs找到。
链接地址: http://www.djcxy.com/p/11423.html上一篇: Can C#/.net parse exponential hex encoded floating point numbers from strings?
下一篇: Difficult Marshalling DirectX array of structs from C++ to C#