Forum: Compiler & IDEs PDU in ASCII wandeln


von Bastian F. (bastian_f)


Angehängte Dateien:

Lesenswert?

Hallo,
ich versuche mit der Funktion, die hier 
(Beitrag "Re: SMS im PDU Format entschlüsseln C-Code") gepostet wurde 
eine SMS im PDU Format umzuwandeln.
Momentan noch am Rechner, da geht das testen schneller, aber es soll auf 
einem AVR laufen, deswegen habe ich hier gepostet.

In einem Beitrag dort steht, dass die Daten als HEX Werte übergeben 
werden müssen, was ich auch probiert habe.
1
char sms[]={30,37,39,31,39,34,37,31,30,37,31,36,30,30,30,30,30,34,30,43,39,31,39,34,37,31,38,38,32,30,39,35,37,35,30,30,30,30,31,31,33,30,31,31,34,31,38,33,30,35,34,30,30,32,34,31,33,37};
2
strcpy(SMSBuffer,sms);
Außerdem habe ich probiert die SMS komplett zu kopieren.
1
strcpy(SMSBuffer,"0791947107160000040C91947188209575000011301141830540024137");
Beides hat nicht geklappt.

Es kommt immer sowas in der Art bei raus:
JyqDH<yAD<xbcJ)rC   <R<xxqya#DxpDH!J

Außerdem gibt mir der Compiler folgende Warnungen:
control reaches end of non-void function  main.c  /c_lokal  line 91 
C/C++ Problem
pointer targets in passing argument 1 of ‘strcpy’ differ in signedness 
main.c  /c_lokal  line 79  C/C++ Problem

Mit der Ersten kann ich nichts anfangen und bei der Zweiten ist es wohl 
so, dass sich unsigned und "nicht unsigned" in die Quere kommen, aber da 
weiß ich auch nicht, wie ich dies beheben kann.

Vielleicht kann jemand helfen, oder hat eine andere Funktion die mir die 
PDU SMS in Klartext umwandeln kann.
Danke,
Basti

von Andreas B. (Gast)


Lesenswert?

Bastian F. schrieb:
> Mit der Ersten kann ich nichts anfangen und bei der Zweiten ist es wohl
> so, dass sich unsigned und "nicht unsigned" in die Quere kommen, aber da
> weiß ich auch nicht, wie ich dies beheben kann.

Der erste Fehler bedeutet genau das was da steht: main() soll ein int 
zurückgeben, aber nirgends gibt es ein return, das auch ein int zurück 
gibt. Und das signed/unsigned Problem lässt sich auch trivial lösen, 
indem man beiden den selben Typ gibt.

Das erste offensichtliche, große Problem ist das strcpy(). Das kopiert C 
Strings, und die sind mit Null terminiert. Dein sms[] hört aber nicht 
mit einer Null auf, also kopiert das strcpy beliebig viel mehr und 
schreibt möglicherweise über das Ende von SMSBuffer raus.

von Bastian F. (bastian_f)


Angehängte Dateien:

Lesenswert?

Ok, habe es mal deinen Verbesserungen nach geändert (siehe Anhang), aber 
es kommt trotzdem nur Zeichensalat bei raus.

von Andreas B. (Gast)


Lesenswert?

Die Dekodierung stimmt auch nicht. Erst mal müssen die hexadezimal in 
ASCII geschriebenen Bytes in die direkte Binärform konvertiert werden. 
Also statt dem strcpy() eine Funktion, die immer zwei Zeichen zu einem 
Byte dekodiert.

Zweitens würde pdu2asci() auch unter den Umständen nicht stimmen — schon 
die Bitposition 0 nimmt nur die untersten 7 Bit des ersten Bytes, obwohl 
es (wenn ich PDU richtig verstanden haben) den Wert um eine Position 
nach rechts shiften müsste.

Mal eine ungetestete Funktion:
1
char getc_at_bitpos(char *buffer, unsigned int bit)
2
{
3
        uint16_t c;
4
5
        c = buffer[bit/8] << 8 | buffer[bit/8+1];
6
        bit = bit % 8;
7
8
        return c >> (9 - bit);
9
}

Diese Funktion aufgerufen für jede Bitposition im Puffer (also in dem 
Fall immer +7 mit jedem Schritt) sollte dann jedes Zeichen ergeben.

von Andreas B. (Gast)


Lesenswert?

Ups, das achte Bit muss freilich gelöscht werden:
1
return (c >> (9 - bit)) & 0x7f;

von Andreas B. (Gast)


Lesenswert?

Nochmal Unsinn, die Bits werden doch von unten rein geschoben, also 
passt meine Funktion nicht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.