通过串口收发短消息(上)
2010-06-29 20:42:35 来源:WEB开发网用以上编码和解码模块,还不能将短消息字符串编码为PDU串需要的格式,也不能直接将PDU串中的用户信息解码为短消息字符串,因为还差一个在可打印字符串和字节数据之间相互转换的环节。可以循环调用sscanf和sprintf函数实现这种变换。下面提供不用这些函数的算法,它们也适用于单片机、DSP编程环境。// 可打印字符串转换为字节数据
// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// pSrc: 源字符串指针
// pDst: 目标数据指针
// nSrcLength: 源字符串长度
// 返回: 目标数据长度
int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
for (int i = 0; i < nSrcLength; i++)
{
// 输出高4位
if (*pSrc > = ''0'' && *pSrc <= ''9'')
{
*pDst = (*pSrc - ''0'') << 4;
}
else
{
*pDst = (*pSrc - ''A'' + 10) << 4;
}
pSrc++;
// 输出低4位
if (*pSrc >= ''0'' && *pSrc <= ''9'')
{
*pDst |= *pSrc - ''0'';
}
else
{
*pDst |= *pSrc - ''A'' + 10;
}
pSrc++;
pDst++;
}
// 返回目标数据长度
return nSrcLength / 2;
}
// 字节数据转换为可打印字符串
// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
// pSrc: 源数据指针
// pDst: 目标字符串指针
// nSrcLength: 源数据长度
// 返回: 目标字符串长度
int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
const char tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表
for (int i = 0; i < nSrcLength; i++)
{
// 输出高4位
*pDst++ = tab[*pSrc >> 4];
// 输出低4位
*pDst++ = tab[*pSrc & 0x0f];
pSrc++;
}
// 输出字符串加个结束符
*pDst = ''\0'';
// 返回目标字符串长度
return nSrcLength * 2;
}
关于GSM 03.42中的压缩算法,至今还没有发现哪里用过,这里我们就不讨论了。有兴趣的话,可深入研究一下。
本文配套源码
赞助商链接