2010-04-11 6 views
3

J'ai récemment décidé d'entreprendre un projet de SMS pour l'envoi et la réception de SMS via un mobile.Décalage de bit en C

Les données sont envoyées au format PDU - je dois changer les caractères ASCII 7 bits à caractères de l'alphabet GSM. Pour ce faire, j'ai rencontré plusieurs exemples, tels que http://www.dreamfabric.com/sms/hello.html

Cet exemple montre les bits les plus à droite du second septet, qui sont insérés dans le premier septect, pour créer un octet.

Les décalages de bits ne provoquent pas cela, car >> insère vers la gauche et < < vers la droite. Si je comprends bien, j'ai besoin d'une sorte de rotation bit à bit pour créer cela - quelqu'un peut-il me dire comment déplacer les bits de la main droite et les insérer sur la gauche?

Merci,

+0

Ah, cela ramène des souvenirs. :) J'adore comment ils ont défini comment le numéro de service et le numéro de téléphone doivent être encodés ... – epatel

+0

Si votre problème est l'absence d'instruction de rotation n en C, vous pouvez le simuler avec '>> n',' << (longueur-n) 'et' | 'en général. –

+0

Vous n'avez pas besoin d'une rotation bit à bit. Vous avez besoin du bit bas d'un octet * adjacent *, pas des bits qui ont été décalés par rapport à l'octet courant. –

Répondre

3

Voici un algorithme rapide de le faire:

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; 

Il convertit les tampons comprimés 7bit à des tableaux réguliers char ASCII en C.

0

quelqu'un peut me dire comment déplacer les bits à partir du côté droit et insérer eux sur la gauche?

Il existe des moyens indirects en C mais je voudrais simplement le faire comme ceci:

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

Cela tourne (ne se déplace pas!) Les bits vers la gauche (une étape). "ror" tournera vers la droite.

+1

.. bien sûr, vous devrez remettre la valeur d'EAX à "x". – Poni