我正在编写一种算法,用于将大型SMS消息(> 140字节)拆分成较小的部分(140字节),以便能够通过SMPP协议将它们发送给移动运营商。
每个部分都有一个由6或7个字节组成的UDH(用户数据头)。我用于此的文档是:
http://en.wikipedia.org/wiki/Concatenated_SMS
http://mobiletidings.com/2009/02/18/combining-sms-messages/
所以消息部分的结构将是:
[UDH] [PART_BODY]其中
[UDH] - 6或7个字节
[PART_BODY] - 133或134字节
此外,上述每个来源都提到,如果使用GSM7编码,则应在零件主体的开头添加填充位,以确保零件主体将在septet边界上开始。
这是我开始感到困惑的地方......虽然我理解septets是如何存储在一个字节中的,以及填充意味着什么,我不明白如何在我的实际代码中实现这一点,如下所示:
public void AddUDHToSmSend(ref SMSend Sm, byte[] Udh)
{
byte[] msg = new byte[Udh.Length + Sm.Message.Length];
Udh.CopyTo(msg, 0);
Sm.Message.CopyTo(msg, Udh.Length);
Sm.Message = msg;
}
Udh - 一个字节数组
Sm.Message - 表示零件正文的字节数组
如何在此上下文中添加填充位?
谢谢!
答案 0 :(得分:0)
因此,除非Sm.message类正在进行打包,否则您需要自己实现它。
像这样的东西(伪c#):
class Bitpacker {
Bitpacker(Byte* buffer, int size) {
mBuf = buffer;
mSize = size;
mLen=0;
mOffset=0;
}
int pack(Byte val, int nbits) {
val&=(1<<nbits)-1; //restrict to `nbits` bits
mBuf[mLen]|= val<<mOffset;
mOffset+=nbits;
if (mOffset>=8) {
mBuf[mLen++]|= val>>(8-nbits);
mOffset-=8;
}
return mLen; //todo - check that mLen !=size;
}
}
然后你可以使用这个类首先打包标题,然后是填充,然后是正文。
foreach octet in header {
packer.pack(octet,8);
bitcount+=8;
}
padbits = bitcount%7;
packer.pack(0,padbits);
foreach septet in body {
packer.pack(septet,7);
}