1 #include "stdafx.h" 2 #include "Sms.h" 3 #include "Comm.h" 4 5 // 可打印字符串转换为字节数据 6 // 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} 7 // 输入: pSrc - 源字符串指针 8 // nSrcLength - 源字符串长度 9 // 输出: pDst - 目标数据指针 10 // 返回: 目标数据长度 11 int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength) 12 { 13 for (int i = 0; i < nSrcLength; i += 2) 14 { 15 // 输出高4位 16 if ((*pSrc >= '0') && (*pSrc <= '9')) 17 { 18 *pDst = (*pSrc - '0') << 4; 19 } 20 else 21 { 22 *pDst = (*pSrc - 'A' + 10) << 4; 23 } 24 25 pSrc++; 26 27 // 输出低4位 28 if ((*pSrc>='0') && (*pSrc<='9')) 29 { 30 *pDst |= *pSrc - '0'; 31 } 32 else 33 { 34 *pDst |= *pSrc - 'A' + 10; 35 } 36 37 pSrc++; 38 pDst++; 39 } 40 41 // 返回目标数据长度 42 return (nSrcLength / 2); 43 } 44 45 // 字节数据转换为可打印字符串 46 // 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01" 47 // 输入: pSrc - 源数据指针 48 // nSrcLength - 源数据长度 49 // 输出: pDst - 目标字符串指针 50 // 返回: 目标字符串长度 51 int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength) 52 { 53 const char tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表 54 55 for (int i = 0; i < nSrcLength; i++) 56 { 57 *pDst++ = tab[*pSrc >> 4]; // 输出高4位 58 *pDst++ = tab[*pSrc & 0x0f]; // 输出低4位 59 pSrc++; 60 } 61 62 // 输出字符串加个结束符 63 *pDst = '\0'; 64 65 // 返回目标字符串长度 66 return (nSrcLength * 2); 67 } 68 69 // 7bit编码 70 // 输入: pSrc - 源字符串指针 71 // nSrcLength - 源字符串长度 72 // 输出: pDst - 目标编码串指针 73 // 返回: 目标编码串长度 74 int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength) 75 { 76 int nSrc; // 源字符串的计数值 77 int nDst; // 目标编码串的计数值 78 int nChar; // 当前正在处理的组内字符字节的序号,范围是0-7 79 unsigned char nLeft; // 上一字节残余的数据 80 81 // 计数值初始化 82 nSrc = 0; 83 nDst = 0; 84 85 // 将源串每8个字节分为一组,压缩成7个字节 86 // 循环该处理过程,直至源串被处理完 87 // 如果分组不到8字节,也能正确处理 88 while (nSrc < nSrcLength) 89 { 90 // 取源字符串的计数值的最低3位 91 nChar = nSrc & 7; 92 93 // 处理源串的每个字节 94 if(nChar == 0) 95 { 96 // 组内第一个字节,只是保存起来,待处理下一个字节时使用 97 nLeft = *pSrc; 98 } 99 else 100 { 101 // 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节 102 *pDst = (*pSrc << (8-nChar)) | nLeft; 103 104 // 将该字节剩下的左边部分,作为残余数据保存起来 105 nLeft = *pSrc >> nChar; 106 107 // 修改目标串的指针和计数值 108 pDst++; 109 nDst++; 110 } 111 112 // 修改源串的指针和计数值 113 pSrc++; 114 nSrc++; 115 } 116 117 // 返回目标串长度 118 return nDst; 119 } 120 121 // 7bit解码 122 // 输入: pSrc - 源编码串指针 123
GSM短信息部分代码!(转---个人收藏)
最新推荐文章于 2024-02-07 21:32:32 发布
本文档提供了GSM短消息的编码和解码算法实现,包括7位编码、8位编码和UCS2编码的转换,以及PDU编码和解码的详细过程。代码涵盖了字符串与字节数据的相互转换,以及GSM短消息的发送和接收操作。
摘要由CSDN通过智能技术生成