我需要一个快速的解决方案来将float(4个字节)和double(8个字节)序列化为二进制表示,以便通过网络发送它们。
问题是我必须使用的格式:
尾数* 10 ^指数
其中尾数是有符号整数(编码float时为4个字节,double为8个字节),指数编码为1个字节。
指数是一个基数10,所以位移技巧对我来说似乎没用,我必须将尾数与exponenet分开才能序列化它们。
任何建议都将不胜感激
答案 0 :(得分:2)
您对编码的尾数是整数的说法让我感到困惑。它必须表示某种形式的浮点数,可能以4或8个字节编码。
对于任何正数x,您可以唯一地将x
表示为
x = 10^(f + n) = 10^f * 10^n
其中n
是整数,0 <= f < 1
。注意
f + n = log10(x)
按照定义。
对于正 x ,我能想象的最简单的代码是:
double lg10 = log10(x);
double f = fmod(lg10, 1.0);
int n = lg10 - f
encode_mantissa(pow(10.0, f));
encode_exponent(n);
对于否定x
,您需要在应用上述代码之前取绝对值,然后以适当的方式对符号进行编码。
这是三个非平凡的浮点运算,但这些都是硬件在硬件上完成的。您仍然必须解决将尾数编码为四个或八个字节值的问题。
答案 1 :(得分:0)
为什么需要查看表示?
如何在连接的各端使用htonl和ntohl函数,并以二进制形式发送它们。