Как уже отмечалось, код, который вы выложили не является переносимым. Дело не только в причине судьбы. Литье от char *
до unsigned short *
также может вызывать bus errors из-за неправильного выравнивания. Кроме того, могут быть биты заполнения в unsigned short
, которые приводят к неправильной работе вашей программы, или unsigned short
может быть меньше или больше, чем «2 байта» в зависимости от CHAR_BIT
и вариантов реализации. Общая проблема заключается в внутреннем представлении типов, и вы можете избежать этой проблемы, используя операторы, которые ведут себя одинаково независимо от внутреннего представления. Возможно, вы имели в виду:
unsigned short offset = (unsigned char) buf[0];
offset *= (UCHAR_MAX + 1);
offset += (unsigned char) buf[1];
offset &= COMPRESSION_MASK;
Если вы хотите большой эндиан, вы должны явно указать, что хотите. Умножая buf[0]
и добавляя buf[1]
, я указываю, что buf[0]
является более значительным, чем buf[1]
, поэтому я явно указываю, что хочу большой endian. Умножения и дополнения работают одинаково во всех реализациях C, и нет проблем с выравниванием.
реверсивного преобразования:
unsigned char buf[2] = { offset/(UCHAR_MAX + 1), offset % (UCHAR_MAX + 1) };
Было бы хорошо, чтобы увидеть больше кода, написанного без заботы о внутреннем представлении!
Какой тип 'buf'? Можете ли вы показать немного больше кода, чтобы сделать это более понятным? –
ntohs() меняет порядок байтов – gabriel