C#decimal to C ++ float和javascript number

时间:2016-12-22 09:03:12

标签: javascript c# c++

我有一个用c#编写的tcp服务器。我必须写两个客户端(c ++和javascript)。我可以在c#客户端反序列化十进制(16byte - 128bit)但我不能反序列化其他语言。

小数不要太大,我可以使用float或double。

序列化十进制时:

ng-click

序列化为:

MemoryStream combinedMessage = new MemoryStream();
decimal d = 2135102.06m;
using (BinaryWriter writer = new BinaryWriter(combinedMessage, encoding))
{
    writer.Write(d);
}

byte[] message = combinedMessage.ToArray();

如何在c ++和javascript中从byte []反序列化十进制?

1 个答案:

答案 0 :(得分:5)

前12个字节是小端96位整数,字节13和14未使用(现在),字节15包含标度(10的幂除以),字节16包含符号位MSB(其他未使用的位)。主要的难点在于精确的转换 - 即使小数是“不太大”,将其转换为floatNumber可以在失去或多或少精度方式进行

以下例程不一定是转换小数的最准确方法,也不一定是最快的,但如果你不是过分关注准确性或速度,那么它将完成工作,并且它具有易于实现的好处翻译成大多数任何类C语言。这是在JavaScript中:

var b = [ 62, 232, 185, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 ];

var d = 0.0;
for (var i = 11; i >= 0; --i) {
    var k = b[i];
    for (var j = 0; j != 8; ++j) {
        d *= 2;
        d += (k & 0x80) >> 7;
        k <<= 1;
    }
}
var scale = b[14];
d /= Math.pow(10, scale);
if (b[15] >= 0x80) d = -d;

这几乎是有效的C#;您需要更改的是Math.Powbyte[] b = { 62 ... }。对于C(以及扩展的C ++),更改并不复杂:

#include <math.h>

unsigned char b[] = { 62, 232, 185, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 };

double d = 0.0;
for (int i = 11; i >= 0; --i) {
    unsigned char k = b[i];
    for (int j = 0; j != 8; ++j) {
        d *= 2;
        d += (k & 0x80) >> 7;
        k <<= 1;
    }
}
int scale = b[14];
d /= pow(10, scale);
if (b[15] >= 0x80) d = -d;