2011-04-19 2 views
0

큰 SMS 메시지 (> 140 바이트)를 SMPP 프로토콜을 통해 이동 통신사에 보낼 수 있도록 작은 부분 (140 바이트)으로 분할하는 알고리즘을 작성 중입니다.C#에서 SMS 연결을위한 GSM7 비트 패딩

각 파트에는 6 또는 7 바이트로 구성된 UDH (사용자 데이터 헤더)가 있습니다. I이 사용 설명서는 다음

http://mobiletidings.com/2009/02/18/combining-sms-messages/

http://en.wikipedia.org/wiki/Concatenated_SMS 그래서 메시지 부분의 구조가 될 것이다

[UDH] PART_BODY] 여기서

[UDH] - 6 또는 7 바이트

[PART_BODY] - 133 또는 134 바이트

또한 위의 각 소스에서 GSM7 인코딩을 사용하는 경우 부품 바디가 셉 테트 경계에서 시작하는지 확인하기 위해 부품 바디 시작 부분에 패딩 비트를 추가해야한다고 언급했습니다.

여기가 내가 혼란스러워하기 시작합니다 ... septets가 바이트에 저장되는 방법과 패딩의 의미를 이해하는 동안 실제 코드에서 이것을 구현하는 방법을 이해하지 못합니다.

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의 배열 - 부품 몸 나는이 상황에서 패딩 비트를 추가 할 수있는 방법

을 나타내는 바이트의 배열?

감사합니다.

+0

셉펫을 한 바이트에 저장하는 방법을 알려주세요. 묶음 (즉, 7 바이트에 8 개의 셉셉트를 저장할 수 있음) 또는 상위 비트를 무시하고 바이트 당 하나의 셉션? – AShelly

+0

안녕하세요. 포장해야합니다. Thx – Florin

+0

@Florin 해결 했습니까? – IamStalker

답변

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