Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Char (oder bstr) splitten

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.01.2004, 16:01 Uhr
azet



Hallo,
es geht darum ein bestimmtes Verzeichnis aus einer SIM-Karte auszulesen und zu interpretieren. Zur Zeit liegen die Daten noch im XML-Format vor. Ich habe die entsprechenden Daten mit MSXML ausgelesen so dass sie im bstr-Format vorliegen. Den hab ich nach char gecastet (muss nicht im char vorliegen aber vielleicht gehts so besser) Der Inhalt der Variablen sieht so aus:
01 08 08 11 4F 04 00 00 00 0A FF FF FF FF FF FF FF FF FF FF
Jetzt muss ich jedes einzelne Byte welches ja durch ein Leerzeichen getrennt ist interpretieren. Dazu hab ich schon diverse Beispielprogramme ausprobiert die mit Tokens arbeiten aber nix funktioniert. Vielleicht ist ja auch der Ansatz falsch, ich weiß es nicht. Jedenfalls brauch ich jedes Byte einzeln (ist mir egal ob aus der bstr oder der char Variablen) um es anschließend auswerten zu können! Wäre nett wenn einer eine Idee hätte!

Danke und Gruß
azet
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.01.2004, 16:04 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


möchtest du die bytes in lesbaren "text" umwandeln?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.01.2004, 16:07 Uhr
kronos
Quotenfisch
(Operator)


i.d.r.:
1 char = 1 byte
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.01.2004, 19:21 Uhr
~azet
Gast


Fürs erste reicht es wenn die Bytes so vorliegen wie Sie jetzt vorliegen. Byte 5 und 6 zum Beispiel (4F 04) sind File Identifier und verweisen auf eine "Datei" innerhalb der XML-Datei die dann halt den Namen 4F 04 hat. Um aber jetzt auch entsprechend diese "Datei" (besser gesagt Node) ansprechen zu können muss ich halt erstmal Byte 5 und 6 irgendwie aus diesem ganzen String rausbekommen um den Wert dann in späteren Routinen einsetzen zu können. Und genau da hapert es..
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.01.2004, 19:28 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


äh 4F04 sind aber nur zwei buchstaben im besten fall...
bist du dir da sicher das das der dateiname sein soll...
und wenn ja was genau ist dein problem...
liegen dir die daten wirklich als char-array vor?
wenn ja kannst du die ja ganz einfach anspechen...


C++:
char x;
x=myarray[3]; //xwäre jetzt das 4.element( weil von 0 an gezählt wir) deines arrays...



Ich weiss ja nicht so genau wie es den anderen geht aber irgendwie tu ich mir schwer dir zu helfen weil ich nicht genau weiss was du willst....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.01.2004, 09:36 Uhr
azet



Okay, es ist zwar ziemlich komplex und ich wollte euch nicht erschlagen mit Infos aber vielleicht ist es doch besser wenn ich ein wenig mehr dazu sage.
Ich habe die Aufgabe bekommen aus einer GSM SIM-Karte die Symbole (auf einigen SIM-Karten sind kleine Grafiken bzw. Symbole fest gespeichert) auszulesen und darzustellen. Im Moment liegt mir ein Auszug einer SIM-Karte als XML-Datei vor (später wird es direkt aus der SIM gelesen aber das ist ein Problem für später). Eine SIM-Karte ist im Prinzip so aufgebaut wie ein Filesystem, also mit einer Hierarchie aus Ordnern und Dateien. Hier die Relevanten Bereiche innerhalb der XML-Datei:


<?xml version="1.0" encoding="UTF-8" ?>
<FileTreeData CardType="GSM">
<DF Name="DF(GRAPHICS)" FID="5F50">
<EF Name="EF(IMG)" FID="4F20">
<Data>01 08 08 11 4F 04 00 00 00 0A FF FF FF FF FF FF FF FF</Data>
<Data>01 18 10 11 4F 03 00 00 00 32 FF FF FF FF FF FF FF FF</Data>
</EF>
<EF Name="EF(INST03)" FID="4F03">
<Data>18 10 FF FF FF 80 00 01 80 00 01 80 00 01 8F 3C F1 89 20 81 89 20 81 89 20 F1 89 20 11 89 20 11 89 20 11 8F 3C F1 80 00 01 80 00 01 80 00 01 FF FF FF</Data>
</EF>
<EF Name="EF(INST04)" FID="4F04">
<Data>08 08 FF 03 A5 99 99 A5 C3 FF</Data>
</EF>
</DF>
</FileTreeData>


Eigentlich steht da noch mehr drin aber ich habs aus Gründen der Übersichtlichkeit gekürzt. DF bezeichnet dabei einen Ordner und EF eine Datei. Der relevante Ordner in dem die Daten stehen heißt wie unschwer zu erraten ist DF(Graphics) und wird innherhalb der SIM-Karte über die File-ID 5F50 angesprochen. Die File-IDs sind standardisiert und sind bei jeder SIM-Karte gleich. Darunter ist die Datei EF(IMG), dies ist quasi die Index-Datei, in Ihr stehen grundlegende Informationen zu den einzelnen Symbolen auf der SIM-Karte. Wie zu sehen ist sind dort zwei Data-Felder, wobei je ein Data-Feld Informationen zu je einem Symbol enthält. Ich erklär euch mal für das erste Data-Feld die Bedeutung der ersten sechs Bytes (01 08 08 11 4F 04). Dies sind eigentlich die, die für meine Aufgabe relevant sind.
01 - Anzahl der Instanzen des Symbols
08 - Breite des Symbols (in Image-Raster-Points)
08 - Höhe des Symbols
11 - Coding-Scheme (11 = S/W Symbol, 21 = Farb-Symbol)
4F 04 - Tja diese gehören leider zusammen File-ID auf die Datei die weitere Informationen zu dem Symbol enthält

Okay, weiter unten sehen wir dann EF(INST04) mit der File-ID 4F04. Wieder gibt es ein Data-Feld in dem die eigentlichen Informationen stehen. Die ersten beiden Bytes (08 08) stehen hier noch einmal für die Höhe und die Breite des Symbols und die restlichen Bytes sind die eigentlichen Informationen wie die einzelnen Punkte in dem Raster-Image gesetzt sind. Zu erklären wie genau dies definiert ist würde den Rahmen sprengen, aber wenn es einen interessiert kann ich das nachschieben. So jetzt versteht ihr vielleicht besser mein Problem. Um jetzt erstmal die für mich interessanten Informationen auszulesen hab ich mich des MSXML-Parsers bedient. Dort habe ich das Beispiel queryNodes.cpp aus der Doku genommen und für meine Bedürfnisse angepasst. Das ganze ist ein COM-Objekt so dass es mir die Daten als bstr zurückliefert. Da dies in dem Beispiel eine Konsolenanwendung ist, ist es das bei mir auch. Später soll dies natürlich als "normales" Programm laufen aber ich bin ziemlich unbedarft und trau mich jetzt noch nicht an die Programmierung mit MFC dran. Ich will erstmal die grundlegenden Probleme lösen. Das erste war die benötitgen Daten auszulesen, das hat dank Beispielprog ganz gut geklappt. Jetzt hab ich von EF(IMG) das erste Data-Feld ausgelesen und hab folgenden Wert:
01 08 08 11 4F 04 00 00 00 0A FF FF FF FF FF FF FF FF
(normal sind noch ein paar FF hinten dran aber die sind jetzt nicht relevant und ich wollt nicht dass das über mehr als eine Zeile geht, dann wirds nämlich unübersichtlich). Um jetzt mit den einzelnen Werten, die ja jeder eine bestimmte Information enthalten arbeiten zu können, muss ich sie ja irgendwie einzeln auslesen oder ansprechen können. Ich hab es schon mit der Methode probiert die Windalf oben angesprochen hat, aber entweder bekomme ich als Inhalt des Char (null) zurück (wenn ich z.b. das 4. Element anspreche) oder es gibt ein Speicherproblem (wenn ich z.b. das 5. Element anspreche). Naja, wie gesagt ich kenn mich noch nicht so aus und steh wie ein Ochs vorm Berg, aber vielleicht seid Ihr ja so nett und lest euch diesen riesen Beitrag durch und habt eine Idee für mich..

Danke
azet
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.01.2004, 12:38 Uhr
ao

(Operator)


@azet:
Der "Riesen-Beitrag" ist hier durchaus sinnvoll, denn er erklärt (endlich), was du eigentlich vorhast: ein paar numerische Werte aus einem String extrahieren. Das geht z.B. mit sscanf:


C++:
int nNbrOfInstances;
int nWidth;
int nHeight;
int nCodingScheme;
int nFileIDLo;
int nFileIDHi;
int nFileID;

char szData [] = "01 08 08 11 4F 04 00 00 00 0A FF FF FF FF FF FF FF FF";

int nResult;

nResult = sscanf ( szData
                 , "%X %X %X %X %X %X"
                 , &nNbrOfInstances      /* hier landet 01 */
                 , &nWidth               /* hier 08 */
                 , &nHeight              /* hier 08, die zweite */
                 , &nCodingScheme        /* hier 11 */
                 , &nFileIDHi             /* hier 4F */
                 , &nFileIDLo             /* hier 04 */
                 );
assert (nResult == 6);   /* sscanf gibt die Anzahl der Variablen zurueck, die mit Werten gefuellt werden konnten */

nFileID = (nFileIDHi << 8) | nFileIDLo; /* hier FileID aus Highbyte und Lowbyte zusammenbasteln */

/* Kontrolle: Daten ausgeben */
nResult = printf (" %X %X %X %X %X "
             , nNbrOfInstances
             , nWidth
             , nHeight
             , nCodingScheme
             , nFileID
             );



Es erscheint:

Code:
1 8 8 11 4F04




Doku über sscanf solltest du eigentlich genug finden. Unbedingt lesen, ist wichtig!

sscanf ist passend für das char-Array. Für den BSTR gibt es angepasste Versionen; bei Microsoft heißt das wsscanf swscanf, glaub ich.


Bearbeitung von ao:
Fehlerkorrekturen und printf zur Kontrolle



ao

Dieser Post wurde am 12.01.2004 um 12:48 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: