conteo de turno derecho> = ancho del tipo o conteo de turno izquierdo> = ancho del tipo

Soy nuevo en bits, estoy tratando de obtener un valor de 64 bits enviado mediante UDP.

int plugin(unsigned char *Buffer) { static const uint8_t max_byte = 0xFF; uint8_t id[8]; id[0] = (uint8_t)((Buffer[0]) & max_byte); id[1] = (uint8_t)((Buffer[1] >> 8) & max_byte); id[2] = (uint8_t)((Buffer[2] >> 16) & max_byte); id[3] = (uint8_t)((Buffer[3] >> 24) & max_byte); id[4] = (uint8_t)((Buffer[4] >> 32) & max_byte); id[5] = (uint8_t)((Buffer[5] >> 40) & max_byte); id[6] = (uint8_t)((Buffer[6] >> 48) & max_byte); id[7] = (uint8_t)((Buffer[7] >> 56) & max_byte); } 

Estoy recibiendo error, cuenta de turno correcto> = ancho del tipo. Probé de otra manera también

 int plugin(unsigned char *Buffer) { uint64_t id = (Buffer[0] | Buffer[1] << 8 | Buffer[2] << 16 | Buffer[3] << 24 | Buffer[4] < 32 | Buffer[5] << 40 | Buffer[6] << 48 | Buffer[7] << 56); printf("ID %" PRIu64 "\n", id); } 

Se está obteniendo un error en el recuento de turnos a la izquierda> = ancho del tipo. Verifiqué que el sistema es x86_64. ¿Podría alguien decirme la razón por la que está sucediendo? Por favor, sugiéreme un camino a seguir.

Esto sucede debido a la promoción de enteros por defecto, básicamente.

Cuando haces esto:

 uint64_t id = Buffer[7] << 56; 

That Buffer[7] es un unsigned char , pero se promueve a int en la expresión aritmética, y su int no es de 64 bits. El tipo del lado izquierdo no "infecta" automáticamente el lado derecho, simplemente no es así como C funciona.

Necesitas lanzar:

 const uint64_t id = ((uint64_t) Buffer[7]) << 56; 

y así.