JsonCpp读取较大数字出错问题

  JsonCpp是c++中解析Json常用的解析库。在项目开发中,服务端如果用的是java的话都会是以JSON格式进行传输,客户端使用c++的话都会用到JsonCpp。看看下面这个问题:

   json字串:{"@type":"Login","messageType":"Login","sendTime":1403575350411,"receivedTime":0,"loginId":"linzm","password":"123456","messageClientType":"WinForm"}

  解析代码: 

 1   Json::Reader reader;
 2   Json::Value root;
 3   if (reader.parse(str, root))
 4       {
 5          //获取里面内容
 6           OutputDebugString(_T("STRING TO JSON \n"));
 7          //std::string str1 = root["messageType"].asString();
 8          long long tmstamp = ((long long)(root["sendTime"].asUInt()))/1000;
 9
10        WCHAR* wstr = NULL;
11       TimestampToLocalTime(&wstr,tmstamp);
12     }

结果发现第8行会出错,查了下错误原因, 原来SendTime是一个一毫秒为单位的时间戳,其值为1403575350411,这个值的大小远远超出了 unsigned int 或者 int的最大值,只能用INT64来表示, 但是看看Json::Value里面的函数只有asInt, asUint,没有取64位整数的函数,那怎么办呢?里面虽然没有64位的但是有一个asDouble,duoble的指数为11位,能表示的范围比Int64还大,所以上面的asUInt换成asDouble就可以了。

JsonCpp读取较大数字出错问题

时间: 2024-10-10 05:21:33

JsonCpp读取较大数字出错问题的相关文章

java大数字操作:BigInteger,BigDecimal(浮点型)

java大数字操作: BigInteger:大数字整型的 BigDecimal(浮点型):大数字小数的,也适用大的整数 BigInteger: String num1 = "100381828646148164"; String num2 = "10998979766868"; BigInteger big1 = new BigInteger(num1); BigInteger big2 =new BigInteger(num2); System.out.print

mysqldump备份大数据出错

mysqldump备份大数据出错技术 maybe yes 发表于2015-01-26 22:58 原文链接 : http://blog.lmlphp.com/archives/72  来自 : LMLPHP后院 网 站的数据会定期备份,现在数据大了,mysqldump 方法估计是不行了,并且失败了以后并不能接着上次的位置开始备份.报错内容:mysqldump: Error 2013: Lost connection to MySQL server during query when dumpin

POJ2389: 大数字乘法算法

2014-12-26 大数字乘法算法一般是采用模拟"小学生乘法演算过程”方法. 主要算法思想: 1. 乘数a第i)位与乘数b第j)位数字相乘,并将该乘积结果放到乘积结果数组product的第(i+j-1)位中: 2. 检查product的第(i+j-1)位中储存的数字是否超过或等于10,若是,则“取余并且进位”. 细节参考代码: 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 void s

大数字操作、BigInteger的使用 BigDecimal(很大的小数)

1 public class Test4 { 2 public static void main(String[] args) { 3 BigInteger num1=new BigInteger("123456789123456789123456789"); 4 BigInteger num2=new BigInteger("2345678901234567890"); 5 System.out.println("加:"+(num1.add(n

大数字运算

本博客主要讲解 1.BigInteger 2.BigDecimal 在BigInteger类中封装了多种操作,除了基本的加.减.乘.除操作之外,还提供了绝对值.相反数.最大公约数以及判断是否为质数等操作. 当使用BigInteger类时,可以实例化一个BigInteger对象,并自动调用相应的构造函数.BigInteger类具有很多构造函数,但最直接的一种方式是参数以字符串形式代表要处理的数字. BigDecimal和BigInteger都能实现大数字的运算,不同的是BigDecimal加入了小

大数字的计算

package object; import java.math.BigDecimal; import java.math.BigInteger; /** * @author dayu * @Describe 大数字的计算 */ public class BigIntegerDemo { public static void main(String[] args) { BigInteger bigInteger1 = new BigInteger("45645645645645645645645

java 大数字计算

|--代码示例 1 /** 2 * @auther::9527 3 * @Description: 算法学习 4 * @program: oop 5 * @create: 2019-09-12 23:48 6 */ 7 public class Test { 8 public static void main(String[] args) { 9 //乘数 10 int multiplier = 358623965; 11 //被乘数 12 int multiplicand = 20020367

大数字相乘

/** * 大数字相乘 */ public class Test1 { /** * ints * num * @param ints * @param num * @return */ public static int[] mul(int[] ints,int num){ for (int i = 0; i < ints.length; i++) { ints[i] *= num; } for (int i = ints.length-1; i > 0; i--) { ints[i-1] +

Java读取操作大数据excel

工作需要,读取大数据量的excel.用Apache poi的普通模式读取,会抛内存溢出.查询文档得知有另外一种模式--用户模式.该模式不会一下子整个文件load进来放在内存里,而是一行一行的读取,这样就能避免内存溢出了. 上码: package com.ism.excel.pkg07; import java.io.InputStream; import java.sql.SQLException; import java.util.ArrayList; import java.util.Ite