2017-01-24 7 views
2

Я продолжаю сбрасывать информацию о добавлении uint16 в конец полезной нагрузки, а затем в приемник, возвращая его обратно в uint16 в c.C: uint16_t к байтам для добавления в полезную нагрузку отправителя и обратно в приемнике

uint16 - cmpId. Отправитель делает это:

 const UInt8* data = getArray(byteArray); 
     data_length = getLenArray(byteArray) 
     data_length = data_length + 2; 
     UInt8 formatted_data[data_length]; 

     //serialize cmpid 
     formatted_data[data_length-2] = cmpId & 0xff; 
     formatted_data[data_length-1] = cmpId >> 8; 

и приемник делает это:

 UInt8 len = (UInt8) ((smip_receive_t *) data)->payloadLen; 
     UInt8 * payload = (UInt8 *) ((smip_receive_t *) data)->payload; 

     UInt16 cmpid; 
     cmpid = (payload[len-2] << 8) | payload[len-1]; 

Но cmpId не приходит через правильно. Что я делаю не так?

+1

Примечание: Не используйте доморощенного названия для типов фиксированного размера. В вашем названии указан стандартный тип, но ваш код использует неизвестные имена. – Olaf

ответ

2

С:

formatted_data[data_length-2] = cmpId & 0xff; 
formatted_data[data_length-1] = cmpId >> 8; 

Вы должны использовать:

cmpid = (payload[len-1] << 8) | payload[len-2]; 

Не:

cmpid = (payload[len-2] << 8) | payload[len-1]; 
+1

@PaulR: Поскольку OP не использует 'memcpy', Endianness каждой стороны не имеет значения! Компилятор с каждой стороны реализует побитовые операции в соответствии с архитектурой HW, которой он назначен. –

+0

D'oh - вы правы, конечно, я удалю свой комментарий ... –

+1

@PaulR: Перед тем, как вы сделали этот комментарий, я собирался написать свой собственный комментарий в OP, сказав ему что-то вроде «Хорошо, что вы не используете здесь« memcpy », что сделает ваш код зависимым от платформы». –