Как отправить значение 20 из процессора с прямым порядком байтов в процессор с прямым порядком байтов? - PullRequest
0 голосов
/ 10 июня 2019

У меня есть процессор Sparc, который хранит данные в формате с прямым порядком байтов в 32 бита, и процессор Intel, который хранит данные с прямым порядком байтов. Как я могу отправить значение 20 из процессора Sparc в младший порядок байтов?

Я думаю, что 20 представлен 0x00000014 в шестнадцатеричном формате, так что значение в младшем порядке будет 14000000. Это так, или я ошибаюсь?

1 Ответ

0 голосов
/ 10 июня 2019

Я думаю, что 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, вам не нужно заботиться о порядке байтов. Драйвер делает что-то похожее на приведенный выше код для отправки данных в сетевом порядке байтов (с прямым порядком байтов).

...