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