在使用手机模块实现pdu短信收发功能的时候居然要使用7bit ASCII编解码而不是7bit GSM编解码,有点无语。好吧,那九用7bit ASCII编解码吧,比较懒,直接上网搜索,结果baidu、google搜索到的都是7bit GSM编解码,无语了,只能自己写了。。。
7bit ASCII这里就不详细说了,直接贴代码。。。
encode代码如下
1 char szSrc[256] = "hellohello"; 2 int iSrcLen = strlen(szSrc); 3 unsigned char ucDes[256] = {0}; 4 int iDesLen = iSrcLen - iSrcLen/8; 5 6 int i = 0; 7 int pos = 0; 8 int left = 7; 9 int right = 8 - left; 10 for(i=0;i<iDesLen;i++) 11 { 12 ucDes[i] = szSrc[pos] << (8 - left); 13 pos ++; 14 ucDes[i] = ucDes[i] ^ (szSrc[pos] >> (8 - right - 1)); 15 16 if(7 == right) 17 pos ++; 18 left = 7 - right; 19 if(0 == left) 20 left = 7; 21 right = 8 - left; 22 printf("%02x",ucDes[i]); 23 } 24 printf("\n");
输出为:d19766cdfa32ecd9bc
decode代码如下
1 unsigned char szSrc[256] = {0}; 2 szSrc[0] = 0xd1; 3 szSrc[1] = 0x97; 4 szSrc[2] = 0x66; 5 szSrc[3] = 0xcd; 6 szSrc[4] = 0xfa; 7 szSrc[5] = 0x32; 8 szSrc[6] = 0xec; 9 szSrc[7] = 0xd9; 10 szSrc[8] = 0xbc; 11 int iSrcLen = 9; 12 13 char szDes[256] = {0}; 14 int i = 0; 15 int pos = 0; 16 int left = 7; 17 int right = 8 - left; 18 for(i=0;i<iSrcLen;i++) 19 { 20 szDes[pos] = szDes[pos] ^ (szSrc[i] >> (8 - left)) ; 21 pos ++; 22 unsigned char uTmp = szSrc[i] << (8 - right); 23 szDes[pos] = uTmp >> 1; 24 25 if(7 == right) 26 pos ++; 27 left = 7 - right; 28 if(0 == left) 29 left = 7; 30 right = 8 - left; 31 } 32 printf("%s",szDes);
输出为:hellohello