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-パーツ本体を表すバイトの配列

このコンテキストでパディングビットを追加するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

0

したがって、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);
}
于 2011-04-28T18:45:22.767 に答える