Char (oder bstr) splitten



  • 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



  • Welchen Compiler verwendest Du denn ?

    Eventuell gibts ja was in der Compilerlib was bstr entgegen nimmt und es Dir passend wandelt. (CString ? ka)



  • Hi,
    ich verwende VC++ 6.0 - allerdings ist es (bis jetzt) eine reine Konsolenanwendung ohne MFC oder so nen Kram..

    gruss
    azet



  • azet schrieb:

    allerdings ist es (bis jetzt) eine reine Konsolenanwendung ohne MFC oder so nen Kram..

    Wozu dann BSTR? IIRC braucht man das doch nur bei COM...



  • ..ich greife ja auch per COM-Objekt auf die XML-Datei zu und dieses liefert mir halt einen bstr zurück!



  • Klar, den BSTR bekommst wenn den AktiveX XML parser nimmst.

    Den hab ich nach char gecastet

    was aber ned gehen duerfte, oder Du meinst was anderes ...

    Umwandeln von OLE Zeichenketten in C-Zeichenketten macht man per WideCharToMultiByte (WinApi) oder wenn man die ATL benutzt, per conversion makros ...
    Musst aber meist ned umwandeln, wenn weisst, wie nen BSTR funktioniert geht es auch so. Oder Du "Convertierst" den BSTR nach nem wstring (basic_string<wchar_t>), oder noch besser nach basic_string<OLECHAR>, das kostet am wenigsten Energie beim umwandeln. Ist der BSTR korrekt nullterminiert, gehts sogar mittels konstruktor/Zuweisung. das funktioniert sogar auch mit nem basic_stringstream<OLECHAR>, wo dann per Ausgabe funktionen deine Bytefolge auslesen kannst ....

    // wir nehmen mal an, BSTR strXMLString ist dein String vom parser, und richtig nullterminiert ... 
    std::wstring strpuffer
    std::basic_stringstream<wchar_t> strmystream(strXMLString);
    std::vector<unsigned char> myByteField;
    for(int i = 0;!strmystream.eof(); ++i)
    {
        wchar_t * strStopped;
        strXMLString >> strpuffer;
        myByteField(i) = reinterpret_cast<unsigned char>(wcstoul(strpuffer.c_str(),&strStopped,16));
    }
    

    Sowas in der Art sollte gehen ... code nicht getestet !

    Ciao ..



  • Oder probiere mal den Ansatz:

    ...
    std::string strTemp;
    
    wi_BSTRToChar(bstr , str);
    strcpy(....., strTemp.c_str());
    ....
    
    HRESULT BSTRToChar(BSTR deineVar, std::string& deinStrBuffer)
    {
    	DWORD cb , cwch = ::SysStringLen(deineVar); //laenge von BSTR wird ermittelt
    	char *szOut = NULL; //char Pointer initialisiert
    
    	cb = ::WideCharToMultiByte(CP_ACP, 0, deineVar, cwch + 1, NULL, 0, 0, 0); //
    	if(cb)
    	{
    		szOut = new char[cb];
    
    		if(szOut)
    		{
    			szOut[cb - 1] = '\0';
    
    			if(!::WideCharToMultiByte(CP_ACP,0,deineVar,cwch+1,szOut, cb, 0, 0))
    {
    delete [] szOut;
    return E_FAIL;
    }
    }
    deinstrBuffer = szOut;
    delete szOut;
    }
    return S_OK;
    }
    

    So in der Art funzt das.


Log in to reply