C# 中 SMS 连接的 GSM7 位填充

发布于 2024-11-01 22:28:54 字数 1019 浏览 0 评论 0原文

我正在编写一种算法,用于将大型 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 编码,则应在以下位置添加填充位零件主体的开头,以确保零件主体将在七重边界上开始。

这就是我开始感到困惑的地方......虽然我理解七位元如何存储在字节中以及填充的含义,但我不明白如何在我的实际代码中实现它,如下所示:

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 - 表示零件主体的字节数组

如何在此上下文中添加填充位?

谢谢!

I'm writing an algorithm for splitting large SMS messages(>140 bytes) into smaller parts(140 bytes) in order to be able to send them to mobile operators via SMPP protocol.

Each part has an UDH(User Data Header) consisting of 6 or 7 bytes. The documentation I used for this is:

http://en.wikipedia.org/wiki/Concatenated_SMS

http://mobiletidings.com/2009/02/18/combining-sms-messages/

So the structure of a message part will be:

[UDH][PART_BODY] where

[UDH] - 6 or 7 bytes

[PART_BODY] - 133 or 134 bytes

Also, each of the sources above mention that, if GSM7 encoding is used, padding bits should be added at the beginning of the part body to ensure that the part body will start on a septet boundary.

This is where I start to get confused... While I understood how septets are stored in a byte and what padding means, I don't understand how to implement this in my actual code that looks like this:

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 - an array of bytes

Sm.Message - an array of bytes representing the part body

How can I add a padding bit in this context?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无远思近则忧 2024-11-08 22:28:54

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

So unless the Sm.message class is doing the bit packing, you are going to need to implement it yourself.

Something like this (pseudo-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;
   }
}

Then you can use this class to pack first the header, then the padding, then the 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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文