我有一个用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 []反序列化十进制?
答案 0 :(得分:5)
前12个字节是小端96位整数,字节13和14未使用(现在),字节15包含标度(10的幂除以),字节16包含符号位MSB(其他未使用的位)。主要的难点在于精确的转换 - 即使小数是“不太大”,将其转换为float
或Number
可以在失去或多或少精度方式进行
以下例程不一定是转换小数的最准确方法,也不一定是最快的,但如果你不是过分关注准确性或速度,那么它将完成工作,并且它具有易于实现的好处翻译成大多数任何类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.Pow
和byte[] 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;