c++ - tipos - unsigned long arduino español
Convierta 4 bytes a largo en el error de Arduino (3)
Estoy teniendo una inconsistencia realmente extraña.
Me estoy preparando para leer archivos binarios en Arduino (para un jugador midi, en caso de que estuvieras interesado). Si trato de combinar 4 bytes en Arduino con un largo, me da un resultado incorrecto.
Sin embargo, si uso el código equivalente en la PC, obtengo el valor correcto.
La entrada es: 0x12481248 (0x12, 0x48, 0x12, 0x48) (realmente un número aleatorio).
Arduino da: 4680.
Code :: Blocks gives: 306713160.
4680 es lo mismo que 0x1248, y el resultado que obtienes cuando usas un int en vez de largo en Arduino (se omiten 2 bytes).
Código Arduino:
void setup(){
Serial.begin(57600);
char read1 = 0x12;
char read2 = 0x48;
char read3 = 0x12;
char read4 = 0x48;
unsigned long testint = read1<<24|read2<<16|read3<<8|read4;
unsigned long testint2 = 306713160;
Serial.println(testint);
Serial.println(testint2);
}
void loop(){}
testint2 es para mostrar que no es causado por Serial.println (). La salida del monitor serial es de hecho:
4680
306713160
Código C ++:
#include <iostream>
using namespace std;
int main(){
char read1 = 0x12;
char read2 = 0x48;
char read3 = 0x12;
char read4 = 0x48;
unsigned long testint = read1<<24|read2<<16|read3<<8|read4;
cout << testint;
}
¿Tienes idea de lo que está pasando?
Además, ¿alguien sabe una forma mejor / más bonita de convertir bytes con la biblioteca Arduino / SD?
En Arduino, el tamaño int
es de 16 bits .
En esta línea:
unsigned long testint = read1<<24|read2<<16|read3<<8|read4;
incluso si el resultado se almacena en un unsigned long
(32 bits), las operaciones en modo bit se realizan en int
s.
Cambia esta línea a:
unsigned long testint = (unsigned long)read1 << 24
| (unsigned long)read2 << 16
| (unsigned long)read3 << 8
| (unsigned long)read4;
Esperaría el resultado 4680 (= 0x1248) en cualquier plataforma donde sizeof (int) = 2, y creo que este es el caso de arduino.
Eso es porque (read1 << 24) se convierte implícitamente a int (no largo), por lo que los dos bytes superiores se pierden. Yout debería convertir read * a unsigned long primero
También puedes usar el siguiente código:
uint8_t data[4];
data[0]=read4;
data[1]=read3;
data[2]=read2;
data[3]=read1;
unsigned long testint =*(unsigned long*)(&data);