Когда волноваться о порядке байтов?

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

11
задан GAKOKO 6 February 2010 в 14:40
поделиться

7 ответов

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

-121--3165640-

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

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

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

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

-121--3165641-

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

3
ответ дан 3 December 2019 в 09:20
поделиться

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

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

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

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

6
ответ дан 3 December 2019 в 09:20
поделиться

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

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

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

Найти порядок байтов с помощью программы на языке C

0
ответ дан 3 December 2019 в 09:20
поделиться
>>> mydict={'fruit':'orange','colors':{'dark':4,'light':5}}

>>> def f(mydict):
...  return dict((k+"abc",f(v) if hasattr(v,'keys') else v) for k,v in mydict.items())
... 
>>> f(mydict)
{'fruitabc': 'orange', 'colorsabc': {'darkabc': 4, 'lightabc': 5}}
-121--2116437-

Вам нужно будет закрыть FileStream and Reader, либо явно используя .Close (), либо с помощью оператора using:

using (FileStream fs = new FileStream(@"C:\website\TransList.xslt", System.IO.FileMode.Open))
   {
    xslt.Load(XmlReader.Create(fs));
    using (var reader = mydoc.CreateReader())
        {
         xslt.Transform(reader, null, sw);
        }
     }
-121--4648436-

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

1
ответ дан 3 December 2019 в 09:20
поделиться

Необходимо закрыть FileStream и Reader либо явно с помощью .Close (), либо с помощью оператора using:

using (FileStream fs = new FileStream(@"C:\website\TransList.xslt", System.IO.FileMode.Open))
   {
    xslt.Load(XmlReader.Create(fs));
    using (var reader = mydoc.CreateReader())
        {
         xslt.Transform(reader, null, sw);
        }
     }
-121--4648436-

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

-121--3165640-

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

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

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

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

1
ответ дан 3 December 2019 в 09:20
поделиться

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

0
ответ дан 3 December 2019 в 09:20
поделиться

При получении/передаче данных из сети не забывайте преобразовывать порядок байтов в/из сети и хоста. Здесь следует использовать функции языка Си htons, htonl и т.д. или их эквиваленты в вашем языке.

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

1
ответ дан 3 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: