Need help: Cast from 'char*' to 'uint8_t {aka unsigned char}' loses precision [-fpermissive]
You can't just cast a string to a numeric type - C just doesn't work that way. What you're actually casting is the address in memory that the string resides at.
Instead you need to take the content of the string and interpret it.
For instance, you might take each pair of characters and combine them into a HEX value in a string that you then interpret as a number. That could be done a number of ways.
For example:
char temp[3]; // Temporary space for the conversion string
// Copy two characters into the temporary string
temp[0] = payload[0];
temp[1] = payload[1];
// and terminate the string properly
temp[2] = 0;
// Convert the string using base 16
uint8_t val = strtol(temp, NULL, 16);

In your example string you have 16 characters, which would be 8 bytes of data. So you could put it in a loop:
char temp[3]; // Temporary space for the conversion string
uint8_t vals[8]; // Array to store your values

// Iterate over the values
for (int i = 0; i &lt; 8; i++) {
    // Copy two characters into the temporary string
    temp[0] = payload[i * 2];
    temp[1] = payload[i * 2 + 1];
    // and terminate the string properly
    temp[2] = 0;
    // Convert the string using base 16
    vals[i] = strtol(temp, NULL, 16);
}

Of course there are &quot;lighter&quot; ways of doing it that don't involve an intermediate string or the strtol() function.  For example I often use this little function:
uint8_t h2d(char hex) {
    if(hex &gt; 0x39) hex -= 7; // adjust for hex letters upper or lower case
    return(hex &amp; 0xf);
}

That takes a single character and converts it from hex to decimal. So you can combine that with bit shifting and OR to create a byte from two characters:
val = h2d(payload[0]) &lt;&lt; 4 | h2d(payload[1]);

In your loop that would look like:
for (int i = 0; i &lt; 8; i++) {
    // Convert the string using base 16
    vals[i] = h2d(payload[i * 2]) &lt;&lt; 4 | h2d(payload[i * 2 + 1]);
}