鉴于我有十进制的重复表示 - 你可以在这里找到它- 我尝试用这种方式转换一个double:
explicit Decimal(double n)
{
DoubleAsQWord doubleAsQWord;
doubleAsQWord.doubleValue = n;
uint64 val = doubleAsQWord.qWord;
const uint64 topBitMask = (int64)(0x1 << 31) << 32;
//grab the 63th bit
bool isNegative = (val & topBitMask) != 0;
//bias is 1023=2^(k-1)-1, where k is 11 for double
uint32 exponent = (((uint64)(val >> 31) >> 21) & 0x7FF) - 1023;
//exclude both sign and exponent (<<12, >>12) and normalize mantissa
uint64 mantissa = ((uint64)(0x1 << 31) << 21) | …Run Code Online (Sandbox Code Playgroud) 我想找出存储协议缓冲区支持的列表中未包含的一些常见数据类型的最佳方法.
另外,我们的想法是将它们很容易地映射到相应的C++/Python/Java数据类型.
我最近发现了协议缓冲区,并想知道它们是否可以应用于我的具体问题.
基本上我有一些CSV数据,我需要转换为更紧凑的格式存储,因为一些文件是几个演出.
CSV中的每个字段都有一个标题,只有两种类型,字符串和小数(因为有时会有很多有效数字,我需要以相同的方式处理所有数字).但是每个文件的每个字段都有不同的列名.
除了捕获原始CSV数据,我还需要能够在保存之前向文件中添加额外信息.我希望通过处理不同的文件版本来证明这一点.
那么,是否可以使用协议缓冲区来捕获随机数量的随机命名数据列,如CSV文件?
我们正在将现有的 REST API 服务转换为 gRPC 核心。在迁移现有类时,我们知道 gRPC 没有十进制数据类型。我们在 C# 中有一个类,其定义为
public class SalarySchedule
{
public decimal Salary { get; set; }
public DateTime? SalaryDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我们在 proto 文件中将其实现为
message SalarySchedule
{
// TODO: How to define this double to decimal
double Salary = 1;
google.protobuf.Timestamp SalaryDate =2;
}
Run Code Online (Sandbox Code Playgroud)
目前,我们使用double作为Salary数据类型。但这导致内部计算出现问题。
您能否指导我们,我们如何将其定义为gRPC 中的小数?
我试图将包含使用C#应用程序生成的数据的输入缓冲区(字节数组)转换为java数据类型.我对C#的DecimaldataType 有一些问题.
C#示例:
decimal decimalValue = 20.20M;
//converting a Decimal value to 4 integer vlaues
int[] intPieces= Decimal.GetBits(decimalValue); //{2020,0,0,131072}
//using native constructor to rebuild value
Decimal newDecimalValue = new decimal(intPieces); //20.20
Console.WriteLine("DecimalValue is " + newDecimalValue);
Run Code Online (Sandbox Code Playgroud)
但是Decimaljava中没有(也没有Decimal(int [] bits)构造函数).