2010-04-11 32 views
3

我最近決定開展一個通過手機發送和接收SMS的SMS項目。C中的逐位移位

數據以PDU格式發送 - 我需要將ASCII字符更改爲7位GSM字母字符。要做到這一點,我遇到了幾個例子,如http://www.dreamfabric.com/sms/hello.html

這個例子顯示了第二個septet的最右邊的位,插入到第一個septect中來創建一個octect。

按位移並不會導致這種情況發生,因爲>>將插入到左側,而< <到右側。據我瞭解,我需要一些按位旋轉來創建這個 - 任何人都可以告訴我如何從右側移動位並將它們插入左側?

感謝,

+0

啊,這會帶回回憶。 :)我只是喜歡他們如何定義如何編碼服務號碼和電話號碼...... – epatel 2010-04-11 15:29:01

+0

如果你的問題是在C中沒有旋轉n指令,你可以用'>> n','<<(長度-n)'和'|'。 – 2010-04-11 19:34:34

+0

你不需要按位旋轉。您需要來自*相鄰*字節的低位,而不是從當前字節移出的位。 – 2015-08-17 21:09:41

回答

3

這裏是一個快速的算法來做到這一點:

int b1, bnext; 
int mod; 
int pand; 
char *b; // this is your byte buffer, with message content 
int blen; // this is your byte buffer length 
char sb[160]; 
int totchars = 0; 

b1 = bnext = 0; 
for (int i=0; i < blen; i++) { 
    mod = i%7; 
    pand = 0xff >> (mod + 1); 
    b1 = ((b[i] & pand) << mod) | bnext; 
    bnext = (0xff & b[i]) >> (7 - mod); 
    sb[totchars++] = (char)b1; 
    if (mod == 6) { 
     sb[totchar++] = (char)bnext; 
     bnext = 0; 
    } 
} 
sb[totchar] = 0; 

將7位的壓縮緩衝區轉換爲常規的ASCII字符數組在C

0

誰能告訴我如何從右側移動位 ,並在左側插入 ?

已經有C間接的方式,但我只是不喜歡這樣:

void main() 
{ 
    int x = 0xBAADC0DE; 
    __asm 
    { 
     mov eax, x; 
     rol eax, 1; 
    } 
} 

這將旋轉(不移位!)位向左(一步法)。 「ror」將向右旋轉。

+1

..當然,您需要將EAX的值移回「x」。 – Poni 2010-04-11 15:37:28