MTK电话薄中所用到的数据结构及其在电话薄中的作用

来源:互联网 发布:怎么做淘宝网店 编辑:程序博客网 时间:2024/05/08 16:35

程序就是 数据结构 + 算法。了解了程序的数据结构,那么整个系统就明白一大半了。
下面关于电话薄用到的比较重要的数据结构,看完应该对电话薄有个比较清晰的认识。
第一个问题 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

原创粉丝点击