博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PhoneBook中所用到的数据结构及其作用(MTK)【转】
阅读量:2223 次
发布时间:2019-05-08

本文共 2239 字,大约阅读时间需要 7 分钟。

程序就是 数据结构 + 算法。了解了程序的数据结构,那么整个系统就明白一大半了。

下面关于电话薄用到的比较重要的数据结构,看完应该对电话薄有个比较清晰的认识。
第一个问题 MTK系统中怎么存储电话薄的? (PhoneBook[MAX_PB_ENTRIES])
电话薄中最重要的结构MMI_PHB_ENTRY_BCD_STRUCT PhoneBook[MAX_PB_ENTRIES];
其中PhoneBook是存储电话本的数组,大小为手机的容量 + SIM1卡容量 + SIM2卡容量
注意:PhoneBook中的数组的内容并不是连续的。比如手机容量为500,SIM1为250,SIM2为150,则,数组内容分配如下:手机PhoneBook [0:499]+ SIM1[500:749] + SIM2[750:899]
SIM1的数据是从501(非数组序号)个开始是SIM1的电话薄内容,顺序是SIM1的物理顺序(非拼音顺序)。同理,SIM2的数据是从751(非数组序号)个开始的。
如果SIM1没有满,则,501—751之间的内容后面会是有空的。
对此结构的描述:主要存储电话本的数据
typedef struct
{
MMI_PHB_NUMBER_BCD_STRUCT tel;
MMI_PHB_NAME_STRUCT alpha_id;
U8 field; /* Indicate if an entry has the field */
U8 dummy; /* Make sure each phb structure is two-bytes aligned. */
} MMI_PHB_ENTRY_BCD_STRUCT;
typedef struct
{
U8 type; /* 129-default; 145-international, begin with '+' */
U8 length;
U8 number[(MAX_PB_NUMBER_LENGTH + 1) / 2]; /* half space to store BCD format. */
} MMI_PHB_NUMBER_BCD_STRUCT;
typedef struct
{
U8 name_length; /* Name Length */
U8 name_dcs; /* Name Data Coding Scheme */
U8 name[(MAX_PB_NAME_LENGTH + 1) *ENCODING_LENGTH];
} MMI_PHB_NAME_STRUCT;
说明几点:一下没有说明的都是GSM的SIM格式
1. name[xx]存储电话本中的名字。电话薄中存储的名字有两种方式,一种是UCS2,一种是ASCII。其中UCS2每个字符占用2个Byte,可以表示汉字等。ASCII占用1Byte,只可以表示英文字符(256范围)。。name_length是存储电话薄本名字的长度,为字符的个数,注意不是字节数(因为UCS2是一个字符=2Byte)。
name_dcs,说明存储的名字是什么格式的。对应有UCS2,ASCII 有两种MMI_PHB_ASCII = 0x04,
MMI_PHB_UCS2 = 0x08
2. number[] 是存储电话本中的号码。其格式是用BCD来存储的,其优点是1Byte可以存储2个数字。不包含 + 号的。
Length, 是nubmer数组的内容长度的
Type,这个很重要。对于两种格式。其中,MMI_CSMCC_INTERNATIONAL_ADDR(145),MMI_CSMCC_DEFAULT_ADDR_TYPE(129),145代表真正的number实际上是[+] [number的内容],(此时length,还是number的长度,不包含+号的长度)。
比如电话本中有个号码+123456,则对于的存储是
Number[] = 转换到BCD格式(123456);
Length = 6;
Type = 145;
如果号码是123456,则此时存储如下
Number[] = 转换到BCD格式(123456);
Length = 6;
Type = 129;
由于这种格式我们使用不是很方便,所以涉及到的可能用到的函数如下:
U8 mmi_phb_convert_to_bcd(U8 *dest, U8 *source, U8 max_dest_len);
U8 mmi_phb_convert_to_digit(U8 *dest, U8 *source, U8 max_dest_len);
转换BCD的号码格式到ASCII字符。
由于系统要用UCS2显示,而处理由于节省空间,系统中,英文字符都不是UCS2格式的,所以任何显示要保证是UCS2格式的,这时要用到如下函数
U16 AnsiiToUnicodeString(S8 *pOutBuffer, S8 *pInBuffer);
注意大小关系 strlen(pOutBuffer) > 2×strlen(pInBuffer)
EncodingDecoding(mmi_chset_pair_enum Scheme, char *pOutBuffer, char *pInBuffer, kal_int32 dest_size).
字符转换的一个函数。可以GB2312

转载地址:http://qyifb.baihongyu.com/

你可能感兴趣的文章
后端技术杂谈5:云计算的前世今生
查看>>
后端技术杂谈6:白话虚拟化技术
查看>>
后端技术杂谈7:OpenStack的基石KVM
查看>>
后端技术杂谈8:OpenStack架构设计
查看>>
后端技术杂谈9:先搞懂Docker核心概念吧
查看>>
后端技术杂谈10:Docker 核心技术与实现原理
查看>>
夯实Java基础系列2:Java自动拆装箱里隐藏的秘密
查看>>
夯实Java基础系列1:Java面向对象三大特性(基础篇)
查看>>
夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!
查看>>
夯实Java基础系列4:一文了解final关键字的特性、使用方法,以及实现原理
查看>>
Java 未来行情到底如何,来看看各界人士是怎么说的
查看>>
IntelliJ 平台 2020 年路线图
查看>>
走进JavaWeb技术世界8:浅析Tomcat9请求处理流程与启动部署过程
查看>>
微软宣布加入 OpenJDK,打不过就改变 Java 未来!
查看>>
MyBatis动态SQL(认真看看, 以后写SQL就爽多了)
查看>>
为什么强烈推荐 Java 程序员使用 Google Guava 编程!
查看>>
先搞清楚这些问题,简历上再写你熟悉Java!
查看>>
【数据库】关系数据库和非关系数据库的优缺点
查看>>
【数据结构】动态顺序表
查看>>
Markdown的基础使用
查看>>