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.
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
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.
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
chargetc_at_bitpos(char*buffer,unsignedintbit)
2
{
3
uint16_tc;
4
5
c=buffer[bit/8]<<8|buffer[bit/8+1];
6
bit=bit%8;
7
8
returnc>>(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.