Добавление битов GSM7 для объединения SMS в C # - PullRequest
0 голосов
/ 19 апреля 2011

Я пишу алгоритм для разделения больших SMS-сообщений (> 140 байт) на более мелкие части (140 байт), чтобы можно было отправлять их операторам мобильной связи по протоколу SMPP.

Каждая часть имеет UDH (заголовок пользовательских данных), состоящий из 6 или 7 байтов. Документация, которую я использовал для этого:

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 - массив байтов, представляющих тело детали

Как я могу добавить бит дополнения в этом контексте?

Спасибо!

1 Ответ

0 голосов
/ 28 апреля 2011

Таким образом, если класс 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);
}
...