本文共 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 = 0x082. 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/