【问题标题】:GSM7 bit padding for SMS concatenation in C#在 C# 中用于 SMS 连接的 GSM7 位填充
【发布时间】:2011-04-19 09:02:17
【问题描述】:

我正在编写一种算法,用于将大型 SMS 消息(>140 字节)拆分成更小的部分(140 字节),以便能够通过 SMPP 协议将它们发送给移动运营商。

每个部分都有一个由 6 或 7 个字节组成的 UDH(User Data Header)。我用于此的文档是:

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 - 表示部分正文的字节数组

如何在这种情况下添加填充位?

谢谢!

【问题讨论】:

  • 您希望 septets 如何 存储在一个字节中?打包(即:您可以在 7 个字节中存储 8 个 septet),还是每个字节一个 septet 忽略高位?
  • 嗨。他们应该被打包。谢谢
  • @Florin 你解决了吗?

标签: c# .net sms bit-manipulation smpp


【解决方案1】:

因此,除非 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;
   }
}

然后你可以使用这个类先打包header,然后是padding,然后是body。

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 2011-08-23
    • 2016-09-15
    • 1970-01-01
    • 2016-01-10
    相关资源
    最近更新 更多