Заполнение битов GSM7 для конкатенации SMS в C#

#c# #.net #sms #bit-manipulation #smpp

#c# #.net #sms #манипулирование битами #smpp

Вопрос:

Я пишу алгоритм для разделения больших 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. Как вы ожидаете, что септеты будут храниться в байте? Упаковано (т.Е. вы можете хранить 8 септетов в 7 байтах) или по одному септету на байт с игнорируемым старшим битом?

2. Привет. Они должны быть упакованы. Спасибо

3. @Florin Ты решил это?

Ответ №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) {
      valamp;=(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);
}