uint16_t lenOf(const String &s) {
return *(((uintptr_t*)&s)+2);
}
void setup() {
Serial.begin(115200);
Serial.println("Scrivi qualcosa nella riga di input.");
}
void loop() {
if (Serial.available()) {
String msg = Serial.readStringUntil('\n');
// Come si spiega che la riga sotto stampa
// ciò che digito nella riga di input?
// msg si trova nello stack, &msg restituisce l'indirizzo
// della cella. Trasformo il valore dell'indirizzo
// in puntatore a tipo grande due byte (uint16_t)
// Per ricavare il valore 1EC devo risolverlo con
// il primo asterisco a sinistra.
Serial.println(*(uint16_t*)&msg, HEX);
// qui trasformo 1EC in puntatore (char*)
Serial.println((char*)*(uint16_t*)&msg);
// stampa la lunghezza di msg
Serial.println(lenOf(msg));
Serial.println((uint16_t)msg.c_str(), HEX);
// dump a partire da &msg
uint8_t *p = (uint16_t)&msg;
for (byte i=0; i<6; i++) {
Serial.print(*(p+i), HEX);
Serial.print(' ');
}
Serial.println();
/* il dump stampa:
EC 1 3 0 3 0
1EC è la locazione di memoria in cui si trova il buffer
di classe String. 03 03 sono dimensione e capacità.
Vedi la classe String sotto protect:
*/
}
}