什么是最好的方式来表示系统。小数在缓冲区协议?
-
21-08-2019 - |
题
下 此 个问题,什么是最好的方式来表示一系统。小数目在缓冲区协议?
解决方案
好了,格式网将只是处理这个对你;它运行了类型的属性,并具有完全的支持 decimal
.由于没有直接的表达方式 decimal
在原型,它不会(当前)产生的一个 decimal
酒店自一个".原始"文件,但这将是一个很好的调整,以承认一些常见的类型("BCL.小数"或类似的),并解释它为小数。
作为代表它-我有一个 讨论文件 在此(现在的日期,我的嫌疑人)中的格式网wiki区域;现在有一个工作版本,在格式网,只是它不会给你的。
毫无疑问乔恩和我会锤这出更多后的今天;-p
该格式网版本(。原)是喜欢的东西(从 在这里,):
message Decimal {
optional uint64 lo = 1; // the first 64 bits of the underlying value
optional uint32 hi = 2; // the last 32 bis of the underlying value
optional sint32 signScale = 3; // the number of decimal digits, and the sign
}
其他提示
马克和我有很模糊的计划,拿出一个“共同的PB消息”库,这样你可以代表相当常见的类型(日期/时间和十进制瞬间涌现在脑海中)在一个共同的方式,在可用转换。 .NET和Java(和其他任何人都想贡献)。
如果你很高兴坚持.NET和你正在寻找紧凑,我可能喜欢的东西去:
message Decimal {
// 96-bit mantissa broken into two chunks
optional uint64 mantissa_msb = 1;
optional uint32 mantissa_lsb = 2;
required sint32 exponent_and_sign = 3;
}
符号可以仅通过exponent_and_sign的符号来表示,与所述指数为绝对值。
使尾数可选的两个部分是指0表示的非常紧凑地(但仍0米和0.0000米等之间进行区分)。 exponent_and_sign可能是可以选择的。如果我们真的想。
我不知道马克的项目,但在我的端口I产生局部类,这样你就可以把该和System.Decimal Protobuf.Common.Decimal(或其他)之间的转换成部分类。
我把一个补丁格式-c#-口挂钩而产生的格式课程与当地的小数和时间结构。线的格式明智的,他们是由两个"内在的"原始信息。
稍微简单的实施办法比Jon或Marc的是存储为4 sint32
价值观,其方便的地图平凡输出 十进制。GetBits().
原文件将这样的:
message ProtoDecimal {
sint32 v1 = 1;
sint32 v2 = 2;
sint32 v3 = 3;
sint32 v4 = 4;
}
和转换器将是:
public decimal ConvertToDecimal(AbideDecimal value)
{
return new decimal(new int[] { value.V1, value.V2, value.V3, value.V4 });
}
public ProtoDecimal ConvertFromDecimal(decimal value)
{
var bits = decimal.GetBits(value);
return new ProtoDecimal
{
V1 = bits[0],
V2 = bits[1],
V3 = bits[2],
V4 = bits[3]
}
}
这可能不是作为简单的其他语言,但是如果你仅仅需要目标C#然后它会采取了同样的最大的16字节的其他方法将(虽然值0可能不是作为紧凑地存储-我不知道足够关于复杂的细节如何格式存储整数),同时清楚得多愚蠢-愚蠢的程序像我这样的:)
显然你将要 比赛马匹 如果你想测试性,但我怀疑有多少。