对手机短信的pdu编码熟悉的帮忙看看

fishly_0 2008-07-17 03:52:07
在网上找了一段代码,应该是没问题的,但是有个地方看的不是很明白,为什么7位编码时,要将nLength+1传给gsmEncode7bit,而不是将nLength传给gsmEncode7bit呢?用户数据的长度应该是nLength才对啊,加上1不会出错?我把整个函数的代码都贴出来了,不多,有空的可以看看^_^

if(pSrc->TP_DCS == GSM_7BIT)
{
// 7-bit编码方式
buf[3] = nLength; // 编码前长度
nLength = gsmEncode7bit(pSrc->TP_UD, &buf[4], nLength+1) + 4; // 转换TP-DA到目标PDU串
}




// PDU编码,用于编制、发送短消息
// pSrc: 源PDU参数指针
// pDst: 目标PDU串指针
// 返回: 目标PDU串长度
int gsmEncodePdu(const SM_PARAM* pSrc, char* pDst)
{
int nLength; // 内部用的串长度
int nDstLength; // 目标PDU串长度
unsigned char buf[256]; // 内部用的缓冲区

// SMSC地址信息段
nLength = strlen(pSrc->SCA); // SMSC地址字符串的长度
buf[0] = (char)((nLength & 1) == 0 ? nLength : nLength + 1) / 2 + 1; // SMSC地址信息长度
buf[1] = 0x91; // 固定: 用国际格式号码
nDstLength = gsmBytes2String(buf, pDst, 2); // 转换2个字节到目标PDU串
nDstLength += gsmInvertNumbers(pSrc->SCA, &pDst[nDstLength], nLength); // 转换SMSC到目标PDU串

// TPDU段基本参数、目标地址等
nLength = strlen(pSrc->TPA); // TP-DA地址字符串的长度
buf[0] = 0x11; // 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10)
buf[1] = 0; // TP-MR=0
buf[2] = (char)nLength; // 目标地址数字个数(TP-DA地址字符串真实长度)
buf[3] = 0x91; // 固定: 用国际格式号码
nDstLength += gsmBytes2String(buf, &pDst[nDstLength], 4); // 转换4个字节到目标PDU串
nDstLength += gsmInvertNumbers(pSrc->TPA, &pDst[nDstLength], nLength); // 转换TP-DA到目标PDU串

// TPDU段协议标识、编码方式、用户信息等
nLength = strlen(pSrc->TP_UD); // 用户信息字符串的长度
buf[0] = pSrc->TP_PID; // 协议标识(TP-PID)
buf[1] = pSrc->TP_DCS; // 用户信息编码方式(TP-DCS)
buf[2] = 0; // 有效期(TP-VP)为5分钟
if(pSrc->TP_DCS == GSM_7BIT)
{
// 7-bit编码方式
buf[3] = nLength; // 编码前长度
nLength = gsmEncode7bit(pSrc->TP_UD, &buf[4], nLength+1) + 4; // 转换TP-DA到目标PDU串
}
else if(pSrc->TP_DCS == GSM_UCS2)
{
// UCS2编码方式
buf[3] = gsmEncodeUcs2(pSrc->TP_UD, &buf[4], nLength); // 转换TP-DA到目标PDU串
nLength = buf[3] + 4; // nLength等于该段数据长度
}
else
{
// 8-bit编码方式
buf[3] = gsmEncode8bit(pSrc->TP_UD, &buf[4], nLength); // 转换TP-DA到目标PDU串
nLength = buf[3] + 4; // nLength等于该段数据长度
}
nDstLength += gsmBytes2String(buf, &pDst[nDstLength], nLength); // 转换该段数据到目标PDU串

// 返回目标字符串长度
return nDstLength;
}
...全文
322 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaonengge 2010-07-15
  • 打赏
  • 举报
回复
关注中...怎么没有高手来说一下呢?
xutongfu 2008-07-31
  • 打赏
  • 举报
回复
关注中,帮忙顶下……
hnhuibo 2008-07-30
  • 打赏
  • 举报
回复
移动那里会将8位数据流里面的 每个字节的最高位清0吗?
---------------
不会
btsy2000 2008-07-18
  • 打赏
  • 举报
回复
帮顶一下,学习,关注中~
fishly_0 2008-07-18
  • 打赏
  • 举报
回复
自己up一个
fishly_0 2008-07-17
  • 打赏
  • 举报
回复
第一个问题知道为什么要加1了,是gsmEncode7bit()函数需要的缘故,被这个函数的注解给害了,还好仔细看了一遍,呵呵。另一个问题还请知道的帮忙看看^_^
fishly_0 2008-07-17
  • 打赏
  • 举报
回复
另外还有个问题请教一下: 发送短信时,我们选择的是7bit的编码方式,但是实际上我们又是将这些7位的数据流压缩成8位的数据流,那么移动那里会将8位数据流里面的 每个字节的最高位清0吗?cdma网络的应该是会。
我用一个cdma的手机模块做了一下测试,数据方式选择位7bit编码,然后发送压缩过的"Hello!"字符串即:0xcb,0x32,0x9b,0xfd,0x0e,0x01,我将这串字符发送到我的手机上(移动的号码),结果发现,显示出来的字符就是将 0xcb,0x32,0x9b,0xfd,0x0e,0x01的最高位清0后的字符 H2)** ,**这两个字符打不出来,呵呵

790

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 其他移动相关
社区管理员
  • 移动开发其他问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧