C#C Float和JavaScript号码的小数

C# decimal to C++ float and javascript number

本文关键字:小数 号码 JavaScript Float C#C      更新时间:2023-10-16

我有一个用C#编写的TCP服务器。我必须写两个客户端(C 和JavaScript)。我可以在c#客户端中进行十进制(16byte -128bit)的序列化,但我无法对其他语言进行挑选。

小数不太大,我可以使用浮子或双重。

序列化十进制:

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

序列化为:

        62  232 185 12  0   0   0   0   0   0   0   0   0   0   2   0

我如何从c 和javaScript中的字节[]进行十进制?

前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;