Я думаю, что 20 представлен 0x00000014 в шестнадцатеричном
правый
так что значение в младшем порядке будет 14000000. Это так, или я ошибаюсь?
Вы должны быть более точным. Big / little endian касается только обращений к памяти для архитектурных аспектов или последовательной связи (или хранения), когда выполняется с объектами, размер которых превышает байт. Таким образом, на машине с прямым порядком байтов, если этот int хранится в памяти по адресу ad , в ad записывается байт 14, а в ad + 1, ad + 2 и ad + 3 байта 0. На архитектуре с прямым порядком байтов 14 имеет значение ad + 3, а остальные байты имеют значение 0.
Но в обоих процессорах при загрузке в регистр значения идентичны и обрабатываются одинаково.
И в обоих процессорах, если вы осуществляете связь на уровне байтов, код будет одинаковым . Вам нужно извлечь байты, маскируя и сдвигая и на уровне получателя, чтобы сделать реконструкцию аналогичным образом.
// send an int in its consecutive bytes over a channel. Data is send little endian.
void send_int_to_channel_by_bytes_LSB_first(int ii) {
// ii is an int and I do *not* want to know how it is stored in memory
char cc, mask=0xff;
for(int i=0; i<4; i++) {
cc = (ii >> (i*8)) & mask ;
send_byte_to_channel(cc);
}
}
// Receives 4 bytes from a channel a returns the reconstructed int.
// Data is received little endian.
int rcv_int_from_channel_by_bytes_LSB_first() {
unsigned char cc;
int ii=0;
for(int i=0; i<4; i++) {
cc = rcv_byte_from_channel() ;
ii |= cc << (i*8) ;
}
returns ii;
}
Если вы по какой-то причине предпочитаете сначала выполнять передачу MSB, вам просто нужно повернуть петли for(int i=3; i>=0; i--)
Обратите внимание, что это связано с передачей на уровне байтов, и в этой ситуации вы должны написать сериализованный код, даже если ваша отправляющая и получающая архитектуры имеют одинаковый порядок байтов.
Единственная ситуация, когда вам нужно позаботиться о порядке байтов вашей архитектуры, - это если ваш драйвер или библиотека программного обеспечения обеспечивает передачу на уровне int, и вам необходимо использовать их. В этом случае вы можете поменять местами байты с одной стороны, но обычно передача байтов считается более переносимой.
Обратите внимание, что если ваш перевод выполняется в стандартной сети, такой как tcp / ip, вам не нужно заботиться о порядке байтов. Драйвер делает что-то похожее на приведенный выше код для отправки данных в сетевом порядке байтов (с прямым порядком байтов).