When I encode/decode SMS PDU (GSM 7 Bit) user data, do I need prepend the UDH first?

前端 未结 2 1042
南方客
南方客 2021-02-06 05:17

While I can successfully encode and decode the user data part of an SMS message when a UDH is not present, I\'m having trouble doing so when a UDH is

相关标签:
2条回答
  • 2021-02-06 05:41

    no you don't include the UDH part when encoding, but you if read the GSM phase 2 specification on page 57, they mention this fact : "If 7 bit data is used and the TP-UD-Header does not finish on a septet boundary then fill bits are inserted after the last Information Element Data octet so that there is an integral number of septets for the entire TP-UD header". When you include a UDH part this could not be the case, so all you need to do is calculate the offset (= number of fill bits)

    Calculating the offset, this code assumes that UDHPart is a AnsiString:

    Len := Length(UDHPart) shr 1;
    Offset := 7 - ((Len * 8) mod 7);  // fill bits
    

    now when encoding the 7bit data, you proceed as normal but at the end, you shift the data Offset bits to the left, this code has the encoded data in variable result (ansistring):

     // fill bits
     if Offset > 0 then
      begin
       v := Result;
       Len := Length(v);
       BytesRemain := ceil(((Len * 7)+Offset) / 8);       
       Result := StringOfChar(#0, BytesRemain);
       for InPos := 1 to BytesRemain do
        begin
         if InPos = 1 then
          Byte(Result[InPos]) := Byte(v[InPos]) shl offset
         else
          Byte(Result[InPos]) := (Byte(v[InPos]) shl offset) or (Byte(v[InPos-1]) shr (8 - offset));
        end;
      end;
    

    Decoding is same thing really, you first shift the 7 bit data offset bits to the right before decoding...

    I hope this will set you onto the right track...

    0 讨论(0)
  • 2021-02-06 05:59

    In your case Data is D06536FB0DBABFE56C32

    Get first char is D0 => h (in first 7 bit, the 8th bit not use)

    The rest is 6536FB0DBABFE56C32

    In bin

    (01100101)0011011011111011000011011011101010111111111001010110110000110010

    Shift right to left. => each right 7 bit is a char!

    001100100110110011100101101111111011101000001101111 1101100 110110(0 1100101)

    I shift 7 to left. you can get string from above. but i do for easy show :D

    (1100101)(1101100)(1101100)(1101111)(0100000)(1110111)(1101111)(1110010)(1101100)(1100100)00

    And the string is "ello world"

    combine with first char you get "hello world"

    0 讨论(0)
提交回复
热议问题