Buenos días a todos.
Tengo una serie de problemas con los arrays que para mi no tienen logica y no consigo entender que está fallando. Esto es parte de un código mucho mas amplio pero que he aislado para hacer pruebas. Basicamente necesito poder convertir números enteros de 2 y 4 bytes en arrays y viceversa en BigEndian.
void loop() {
uint16_t i = 512;
uint32_t i2 = 12786783;
uint8_t buffer[sizeof(uint16_t)];
uInt16ToArray(i, buffer);
Serial.println("Array UInt16:");
printArrayHex(buffer, sizeof(uint16_t));
uint16_t newvalue = arrayToUInt16(buffer);
Serial.print("El valor numerico es: "); Serial.println(newvalue);
Serial.println("-----------------------");
uint8_t buffer2[sizeof(uint32_t)];
uInt32ToArray(i2, buffer2);
Serial.println("Array UInt32:");
printArrayHex(buffer2, sizeof(uint32_t));
uint32_t newvalue2 = arrayToUInt32(buffer2);
Serial.print("El valor numerico es: "); Serial.println(newvalue2);
Serial.println("");Serial.println("----------");Serial.println("");
delay(5000);
}
Esto parece simple, un numero de 2 bytes y otro de 4 que he escogido al azar.
Las funciones son las siguientes:
void uInt16ToArray(uint16_t value, uint8_t *array) {
uint8_t len = sizeof(uint16_t);
uint8_t data1[len];
memcpy(data1, &value, len);
array[0] = data1[1];
array[1] = data1[0];
}
uint16_t arrayToUInt16(const uint8_t *d) {
uint16_t data;
data = 0;
data += (uint16_t)d[0] << 8;
data += (uint16_t)d[1];
return data;
}
void uInt32ToArray(uint32_t value, uint8_t *array) {
uint8_t len = sizeof(uint32_t);
uint8_t data[len];
memcpy(data, &value, len);
array[0] = data[3];
array[1] = data[2];
array[2] = data[1];
array[3] = data[0];
}
uint32_t arrayToUInt32(const uint8_t *d) {
uint32_t data;
data = 0;
data += (uint32_t)d[0] << 24;
data += (uint32_t)d[1] << 16;
data += (uint32_t)d[2] << 8;
data += (uint32_t)d[3];
return data;
}
Resulta que la primera pasada pone esto:
Array UInt16:
02-00
El valor numerico es: 47288Array UInt32:
08-B8-B8-B8
El valor numerico es: 3099113656
El array del primer valor es correcto, 02-00 equivale al 512. Pero luego la conversión es incorrecta. El valor del segundo numero es todo incorrecto.
En las siguientes pasadas ya lo hace todo mal:
Array UInt16:
08-B8
El valor numerico es: 47288Array UInt32:
08-B8-B8-B8
El valor numerico es: 3099113656
Lo extraño es que si elimino la parte del código donde hago la conversión del segundo numero (de 4 bytes), hace todo el proceso correctamente con el numero 512.
Saludos!