Когда беспокоиться о порядке байтов? - PullRequest
9 голосов
/ 06 февраля 2010

Я видел бесчисленные упоминания о порядке байтов и их значении. У меня нет проблем с этим ... Тем не менее, мой проект по написанию кода - простая игра, работающая на Linux и Windows, на стандартном оборудовании для геймеров. Нужно ли беспокоиться о порядке байтов в этом случае? Когда мне нужно беспокоиться об этом? Мой код прост: C и SDL + GL, единственными сложными данными являются базовые медиафайлы (png + wav + xm), а игровые данные в основном представляют собой строки, целочисленные логические значения (для флагов и тому подобное) и массивы статического размера. Пока что ни у одного пользователя не было проблем, поэтому мне интересно, нужно ли добавлять проверки (будет сделано позже, но есть более срочные проблемы IMO).

Ответы [ 7 ]

5 голосов
/ 06 февраля 2010

Время, когда вам нужно беспокоиться о порядке байтов:

  • вы отправляете двоичные данные между машинами или процессами (используя сеть или файл). Если у машин может быть другой порядок байтов или используемый протокол определяет конкретный порядок байтов (что и должно быть), вам придется иметь дело с порядком байтов.
  • у вас есть код, который обращается к памяти через указатели разных типов (например, вы получаете доступ к переменной unsigned int через char*).

Если вы делаете эти вещи, вы имеете дело с порядком байтов, знаете ли вы это или нет - возможно, вы имеете дело с этим, предполагая, что это так или иначе, что может работать нормально, пока ваш код не нужно иметь дело с другой платформой.

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

2 голосов
/ 06 февраля 2010

Если вы имеете в виду ПК под «стандартным игровым оборудованием», вам не нужно беспокоиться о порядке байтов, так как он всегда будет иметь младший порядок в x86 / x64. Но если вы хотите перенести проект на другие архитектуры, вам следует разработать его независимо от порядка байтов.

1 голос
/ 06 февраля 2010

Всякий раз, когда вы получаете / передаете данные из сети, не забудьте преобразовать в / из сети и порядок байтов хоста. Функции C htons, htonl и т. Д., Или эквиваленты на вашем языке, должны использоваться здесь.

Всякий раз, когда вы читаете многобайтовые значения (например, символы UTF-16 или 32-битные значения) из файла, поскольку этот файл мог возникнуть в системе с другим порядком байтов Если файл UTF 16 или 32, он, вероятно, имеет спецификацию (метку порядка байтов). В противном случае формат файла должен будет указывать порядок байтов каким-либо образом.

1 голос
/ 06 февраля 2010

Вы распространяете свою игру в виде исходного кода?

Потому что, если вы распространяете свою игру только в виде бинарного файла, то вы точно знаете, на каких семействах процессоров будет работать ваша игра. Кроме того, файлы мультимедиа, они генерируются пользователем (возможно, с помощью редактора уровней), или они действительно должны быть предоставлены только вами?

Если это действительно закрытая среда (ваши дистрибутивные двоичные файлы и игровые ресурсы не предназначены для настройки), то вы знаете свои собственные риски для байтов, и я лично не буду обманывать это.

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

1 голос
/ 06 февраля 2010

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

0 голосов
/ 06 февраля 2010

Я полагаю, что Power PC имеет противоположный порядковый номер плат Intel. Может ли быть возможность иметь процедуру, которая устанавливает порядок байтов в зависимости от архитектуры? Я не уверен, что вы действительно можете сказать, какова аппаратная архитектура в коде ... может быть, кто-то умнее, чем я знаю ответ на этот вопрос

Теперь, ссылаясь на ваше заявление о «стандартном» Gamer H / W, я бы сказал, что обычно вы будете смотреть на решения Consumer Off the Shelf, которые действительно используют большинство стандартных игроков, поэтому вы почти наверняка получите тот же самый порядок байтов через доску. Я уверен, что кто-то не согласится со мной, но это мои $ .02

Ха ... Я только что заметил справа, что появляется ссылка, связанная с предложением, которое я имел выше.

Найти Endianness через программу c

0 голосов
/ 06 февраля 2010

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

...