base64 decodieren



  • moin!
    ich habe eine xml datei mit einem feld, das base64 encodierte int16 paare enthält (koordinaten). das feld wurde gefüllt mit xmlTextWriterWriteBase64 aus libxml2, leider habe ich keinen plan von bitweisen operatoren und habe es erfolglos mit der anpassung der folgenden decodierung versucht:

    // von https://www.c-plusplus.net/forum/296389?highlight=base64
    static const char gB64Base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    void libsf::SignalFileFormatXml::B64Decode(wxInt16Point *pDecodedDestination, const char * pEncodedSource, int pEncodedSourceLength)
    {
    	int lBase64Counter;
    	unsigned char * lBase64Buffer = (unsigned char*)malloc(pEncodedSourceLength);
    
    	// Get the Base64 values
    	for (int i = 0; i < pEncodedSourceLength; i++)
    	{
    		for (lBase64Counter = 0; lBase64Counter < sizeof(gB64Base); lBase64Counter++)
    		{
    			if (pEncodedSource[i] == gB64Base[lBase64Counter])
    			{
    				lBase64Buffer[i] = lBase64Counter;
    				break;
    			}
    		}
    		if (lBase64Counter == sizeof(gB64Base))
    		{
    			lBase64Buffer[i] = 0x00;
    		}
    	}
    
    	// Decode the Base64 values into a ASCII string
    	for (int i = 0; i < pEncodedSourceLength; i += 4)
    	{
    		*pDecodedDestination++ = (lBase64Buffer[i + 0] << 2) | (lBase64Buffer[i + 1] >> 4);
    		*pDecodedDestination++ = (lBase64Buffer[i + 1] << 4) | (lBase64Buffer[i + 2] >> 2);
    		*pDecodedDestination++ = (lBase64Buffer[i + 2] << 6) | (lBase64Buffer[i + 3] >> 0);
    	}
    
    	free(lBase64Buffer);
    	return/*((int)((lTempPointer - (unsigned char *)pDecodedDestination) - 1))*/; // Size of the decoded destination
    }
    

    das ergibt des fehler "error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'int' akzeptiert"

    wie bekomme ich das zum laufen?
    danke!



  • mael15 schrieb:

    wie bekomme ich das zum laufen?

    Indem du dir klar machst, dass, egal was da kodiert wurde, beim Dekodieren immer erst einmal eine Folge von char entsteht. Das uminterpretieren in wxInt16Point ist ein nachgelagerter Schritt.



  • danke, das hilft schon weiter.
    ein char besteht ja nun aus 8 bits. bekomme ich zwei davon möglichst effizient in die 16bits der int16?



  • Vermutlich reicht ein einfaches reinterpret_cast<wxInt16Point*> auf den Zielzeiger. Achte aber darauf, dass die Länge der decodierten Daten (die deine Version unklugerweise nicht mehr zurückgibt) in chars ist, nicht in wxInt16Point.


Log in to reply