Short werte aus Array von Bytes lassen sich nicht ablesen oder kasten



  • Wie soll ich in C++ kasten , so dass ich in den Array von Bytes die 2 -Bytes
    Werte (short) ablesen könnte ?

    beim

    reinterpret_cast<uint16_t *>(...)
    
    kommt ein Fehlermeldung raus :
    error: reinterpret_cast from type ‘const uint8_t* {aka const unsigned char*}’ to type ‘uint16_t* {aka short unsigned int*}’ casts away qualifiers
    


  • o4kareg schrieb:

    Wie soll ich in C++ kasten , so dass ich in den Array von Bytes die 2 -Bytes
    Werte (short) ablesen könnte ?

    beim

    reinterpret_cast<uint16_t *>(...)
    
    kommt ein Fehlermeldung raus :
    error: reinterpret_cast from type ‘const uint8_t* {aka const unsigned char*}’ to type ‘uint16_t* {aka short unsigned int*}’ casts away qualifiers
    

    Öhm.. du darfst in C++ const nicht wegcasten. Außer du verwendest const_cast

    EDIT: Und ich glaube nicht das das casten das machst was du dir vorstellst.



  • Danke, es war voll unklar das das ding wegen Const meckert.

    Eine ziemlich korrekte Lösung wäre dann:

    const uint16_t * lvl2Num = reinterpret_cast<const uint16_t *> (paket +toLook);
    

    Omg, es funktioniert, aber dabei werden die bytes umgetausht 😮
    Nee, c++ macht doch fertig!



  • Du willst also ein Short in 2 Byte splitten:
    Ungefähr so?

    #include <iostream>
    
    unsigned char extract(unsigned short in, unsigned short lowerBound, unsigned short upperBound)
    {
    	if (upperBound > 8)
    	{
    		lowerBound -= 8;
    		upperBound -= 8;
    		in /= 128;
    	}
    
    	unsigned char result = 0;
    	for (unsigned char i = 1 << (upperBound - 1); i >= lowerBound; i >>= 1)
    	{
    		if (in & i)
    			result += i;
    	}
    	return result;
    }
    
    //Testcode
    int main()
    {
    	unsigned short tmp = 4244;
    	unsigned char ch1 = extract(tmp,1,8);
    	unsigned char ch2 = extract(tmp,9,16);
    	std::cout << static_cast<int>(ch1) << '\n';
    	std::cout << static_cast<int>(ch2) << '\n';
    }
    


  • logoffters schrieb:

    Du willst also ein Short in 2 Byte splitten:
    Ungefähr so?

    #include <iostream>
    
    unsigned char extract(unsigned short in, unsigned short lowerBound, unsigned short upperBound)
    {
    	if (upperBound > 8)
    	{
    		lowerBound -= 8;
    		upperBound -= 8;
    		in /= 128;
    	}
    
    	unsigned char result = 0;
    	for (unsigned char i = 1 << (upperBound - 1); i >= lowerBound; i >>= 1)
    	{
    		if (in & i)
    			result += i;
    	}
    	return result;
    }
    
    //Testcode
    int main()
    {
    	unsigned short tmp = 4244;
    	unsigned char ch1 = extract(tmp,1,8);
    	unsigned char ch2 = extract(tmp,9,16);
    	std::cout << static_cast<int>(ch1) << '\n';
    	std::cout << static_cast<int>(ch2) << '\n';
    }
    
    #include <iostream>
    
    unsigned char extract(unsigned short in, unsigned short lowerBound, unsigned short upperBound)
    {
    	unsigned char result = 0;
    
    	if (upperBound > 8)
    		result = in / 256;
    
    	else
    	{
    
    	for (unsigned char i = 1 << (upperBound - 1); i >= lowerBound; i >>= 1)
    	{
    		if (in & i)
    			result += i;
    	}
    	return result;
    	}
    }
    
    int main()
    {
    	unsigned short tmp = 25524;
    	unsigned char ch1 = extract(tmp,1,8);
    	unsigned char ch2 = extract(tmp,9,16);
    	std::cout << static_cast<int>(ch1) << '\n';
    	std::cout << static_cast<int>(ch2) << '\n';
    

    Wohl eher so.



  • unsigned char extract(unsigned short in, unsigned short lowerBound, unsigned short upperBound)
    {
    	unsigned char result = 0;
    
    	if (upperBound > 8)
    		result = in / 256;
    
    	else
    	{
    
    		for (unsigned char i = 1 << (upperBound - 1); i >= lowerBound; i >>= 1)
    		{
    			if (in & i)
    				result += i;
    		}
    	}
    	return result;
    
    }
    

    MIST! Fehler gemacht bei Klammern.


Anmelden zum Antworten