接口返回时间戳,有时候解析不对?原来是......

1,837 阅读1分钟

0、先测试确定范围:不同机型系统测试发现只有32位机器有问题,很有可能被截断了

1、看NSInteger的定义

32位机器上是int类型的,占4个字节,最大可表达(231次方-1)(不是32次方,有一位是符号位)大概是21亿多 -21474836482147483647


ps:自行复习《原码、补码、反码》

2、为什么被截断?

比如接口返回了个时间戳:从1970年到当前时间的毫秒数

{
    "startTime": 1560942803000
}

数一数位数,显然远大于21亿,如果这时候用NSInteger接收就回被截断

3、怎么截断?!

打开系统自带的计算器,显示成编程器

粘贴上面的数值,显示如下:

红框里是高4个字节,绿色框的是低4字节,可以一个一个的把红框里的1点成0
就得到截断后的结果了(ps:仅在被截断后是正数时,因为负数是反码的补码)
解析时取NSNumberintegerValue的时候会只取低4字节,

注意:如果是数值是被双引号包围的,解析的时候用的是字符串。

{
    "startTime": "1560942803000"
}

NSStringintegerValue是做过一些处理的。只要超过了表达范围就返回最大值(32位是2147483647
所以每次解析结果都是2147483647