C#中BitConverter.Int64BitsToDouble的安全性和稳定性问题

我正在编写一个自定义反序列化系统,用于通过网络对数据进行分组,并按以下方式序列化双精度数:

private static string EncodeDouble(double raw)
{
    long value = BitConverter.DoubleToInt64Bits(raw);
    return EncodeInteger(value);
}

EncodeInteger函数只是将整数转换为标记字符串,因此反序列化代码知道它具有正确的数据类型.

另一方面,我的反序列化如下:

private static double DecodeDouble(string raw)
{
    long value = DecodeInteger<long>(raw);
    return BitConverter.Int64BitsToDouble(value);
}

同样,DecodeInteger只删除标记并验证该值是否在范围内一段时间,然后转换为long.这是安全的,因为如果出现任何问题,它只会抛出异常.

我担心的原因是,在进入参考源之后,我看到了这种直接不安全的演员:

public static unsafe double Int64BitsToDouble(long value) {
    return *((double *)&value);
} 

我认为的问题是,long的值可以任意修改,因为它正在通过网络.我并不担心任意修改的值,而是CLR在发送无效的底层双重表示时遇到问题的可能性.

我不确定是否有任何潜在的长值未映射到有效的双精度值,但如果有,我可能会看到什么? CLR会崩溃,导致拒绝服务吗?或者是否有可以捕获的异常?

最佳答案 AFAIK这里没有任何“无效”值;只是不是你原先想到的那些价值观.所以,您在拒绝服务方面没有太多担心.相反,请注意,十进制可能具有无效的二进制表示 – 这些只会引发异常,单个调用将失败 – 仍然不是拒绝服务(只是:它们会看到失败).

但就个人而言,我建议将double编码为long然后编写为字符串可能是以硬/低效的方式进行操作.如果您迫切需要它作为字符串,请考虑使用base-64编码这些位.

点赞