075-989168559
当前位置:主页 > 新闻动态 > 内部发布 >

获取通话记载或通讯录的数量为负值

发布时间:2023-03-03 23:22   浏览次数:次   作者:博亚app官网下载
本文摘要:获取通话记载或通讯录的数量为负值 安卓源码避坑指南5——获取通话记载或通讯录的数量为负值 通过蓝牙PBAP协议同步通讯录、通话记载时,想必对其数量巨细也是很感乐趣的,因此一般的设计思路都是先获取到同步对象的总巨细,然后再同步该对象的详细数据。想法是优美的,然而现实却很魔幻。获取同步对象的总数量这块最近就碰到个奇怪问题——获取到的总数量为负值,今天就和大家一探毕竟,详解此类问题。

博亚app官网下载

获取通话记载或通讯录的数量为负值 安卓源码避坑指南5——获取通话记载或通讯录的数量为负值 通过蓝牙PBAP协议同步通讯录、通话记载时,想必对其数量巨细也是很感乐趣的,因此一般的设计思路都是先获取到同步对象的总巨细,然后再同步该对象的详细数据。想法是优美的,然而现实却很魔幻。获取同步对象的总数量这块最近就碰到个奇怪问题——获取到的总数量为负值,今天就和大家一探毕竟,详解此类问题。

测试情况:android-9车机系统(高通安卓源码) 测试步骤: 测试现象:获取到的通话记载数量为负值,由于应用内部逻辑,错误的负值不再同步该对象,通话记载为空。What?怎么会获取到一个负值呢?带着疑问开始接下来的阐发。首先按照HCI层的交互,可以确定手机答复的数据是正确的,也就是说手机给的通话记载的size是个正数: 当我看到这个数量时,我心里萌生出这个想法:我的天,这哥们这么能打电话嘛… 而蓝牙办事层在吸收到OBEX的答复动静后解析成了负值: 展开全文 按照OBEX协议界说,同步对象的size巨细使用两字节暗示,所以41708的二进制暗示法为:0b1010 0010 1110 1100,而 -23828的二进制暗示法也为:0b1010 0010 1110 1100。

对正负数在计较机中存储形式还不清楚的同学可以打电话给本身的大学计较机老师了(哈哈),这样就可以解释通话记载变为负值的原因了。java中的数据是有符号区分的,两个字节的short类型数据的规模为:-2^15 ~ 2^15-1。而 41708 这个数值很明明已经超出 short类型值的规模,因此溢出被解析成负值。

安卓源码中解析该数据的方法为:com.android.bluetooth.pbapclient.ObexAppParameters. getShort(),当byte型数组中存储的两字节数据超出short类型值的规模就会解析成异常值。解决方案:获取到负值必定不是我们所但愿的,那如何才能正确获取某个同步对象的size巨细值呢?java中没有提供相关方法来获取无符号的数值,可是我们可以通过数值操作间接获取到该数据对应的无符号值。以上方法获取到的short类型值按位与上0xFFFF后赋值给到一个int类型的变量,则该int类型变量暗示的值则为正确的short类型无符号值: 问题延伸 此类问题就是没有思量到数值类型中有符号和无符号数据在值规模上的差异,同样地获取通讯录数量巨细也是存在该风险的。最后的总结:数值由无符号转化为有符号时需注意数值是否有溢出风险。

博亚体育app官网

博亚app下载官方网站

感乐趣的小同伴接待私信留言一起接头,源码避坑,永无尽头,配合进修,一起进步! 更多互联互通技能,接待存眷微信公家号:Connectivity返回,检察更多。


本文关键词:获取,通话,记载,或,通讯录,的,数量,为,负值,博亚app官网下载

本文来源:博亚体育app官网-www.ccwldh.com