Влияет ли порядок байтов при копировании байтов в память? - PullRequest
4 голосов
/ 03 сентября 2010

Прав ли я, считая, что порядок байтов важен только тогда, когда мы говорим о том, как хранить значение и не имеет значения, когда копирует память ?

Например

если у меня есть значение 0xf2fe0000 и я храню его в системе с прямым порядком байтов - байты сохраняются в порядке 00, 00, fe и f2. Но в системе с прямым порядком байтов байты сохраняются f2, fe, 00 и 00.

Теперь - если я просто хочу скопировать эти 4 байта в другие 4 байта (в той же системе), в системе с прямым порядком байтов я получу еще 4 байта, содержащие 00, 00, fe и f2 в таком порядке ?

Или порядок байтов влияет на копирование этих байтов в память?

Ответы [ 7 ]

7 голосов
/ 03 сентября 2010

Порядковый номер имеет значение только в двух сценариях

  1. При ручной проверке дампа байтов многобайтового объекта необходимо знать, упорядочены ли байты в порядке с прямым или младшим порядком байтов, чтобы правильно интерпретировать байты.
  2. Когда программа передает многобайтовые значения с внешним миром, например, через сетевое соединение или файл. Затем обе стороны должны договориться о порядке байтов, используемом в сообщении, и, если необходимо, выполнить преобразование между внутренним и внешним порядком байтов.
4 голосов
/ 03 сентября 2010

Отвечая на заголовок вопроса.

Предположим, что int имеет 4 байта

union{
   unsigned int i;
   char a[4];
};

// elsewhere
i = 0x12345678;
cout << a[0];   // output depends on endianness. This is relevant during porting code
                // to different architectures

Итак, речь идет не о копировании (отдельно)?Речь идет о том, как вы получаете доступ?

Это также важно при передаче необработанных байтов по сети!

3 голосов
/ 03 сентября 2010

memcpy не знает, что копирует. Если ему нужно скопировать 43 61 74 00, он не знает, копирует ли он 0x00746143 или 0x43617400 или число с плавающей запятой или "Cat"

3 голосов
/ 03 сентября 2010

нет при работе на одной и той же машине вам не нужно беспокоиться о порядке байтов, только при передаче двоичных данных между машинами с младшими и старшими номерами

2 голосов
/ 03 сентября 2010

По сути, вам нужно беспокоиться о порядке байтов только тогда, когда вам нужно передавать двоичные данные между архитектурами, которые отличаются эндианозами .

Однако при передаче двоичных данных между архитектурами вам также придется беспокоиться о других вещах, таких как размер целочисленных типов, формат плавающих чисел и другие неприятные головные боли.

0 голосов
/ 16 мая 2019

Memcpy просто копирует байты и не заботится о порядке байтов. Поэтому, если вы хотите скопировать один сетевой поток в другой, используйте memcpy.

0 голосов
/ 03 сентября 2010

Да, вы правы, считая, что вы должны быть осведомлены о порядке байтов при хранении или передаче двоичных значений за пределы вашей текущей "области видимости". Как правило, вам не нужно беспокоиться, пока все находится внутри вашей собственной программы. Если вы копируете память, имейте в виду, что вы копируете. (Вы можете попасть в беду, если сохраните long значения и прочитаете ints).
Посмотрите htonl(3) или книги о сетевом программировании для некоторых хороших объяснений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...