Выявление проблем, связанных с порядком байтов - PullRequest
3 голосов
/ 23 августа 2010

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

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

DxtHeader* header = (DxtHeader*)data;
width = header->width;
height = header->height;

uint pixelFormat = header->pixelFormat.fourCC;
if (pixelFormat == 0x31545844){
    ...
} else if (pixelFormat == 0x33545844){
    ...
} else if (pixelFormat == 0x35545844){
    ...
}

Ответы [ 2 ]

1 голос
/ 23 августа 2010

Вероятно, лучше всего сохранить данные в первую очередь в соответствии с целевой платформой. То есть когда вы создаете файлы данных, endian меняет местами все поля.

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

1 голос
/ 23 августа 2010

Вообще говоря, порядковый номер имеет значение только в том случае, если ваши данные передаются по какому-либо физическому интерфейсу (например, по сети или в файл), где они могли быть получены с платформы с другим собственным порядком байтов.Это также происходит, если вы пытаетесь делать «умные» вещи с помощью приведения указателя, например, int a = 0xABCD; char b = *(char *)&a;.

Из вашего примера неясно, откуда исходные данные, но я предполагаю, что они были прочитаны изфайл или где-нибудь.На самом деле, лучшее место для преобразования порядка байтов - это как можно ближе к интерфейсу, поэтому в вашем случае подпрограмма, которая читает файл и заполняет структуру.Как правило, это можно решить с помощью препроцессора #ifdefs, например, в C (я знаю, что это вопрос C ++, но я уверен, что вы можете найти подходящий эквивалент):

#ifdef (LITTLE_ENDIAN)
#define FILE_TO_NATIVE_16(x)  ((((x) & 0xFF) << 8) | ((x) >> 8))
#else
#define FILE_TO_NATIVE_16(x)  (x)
#endif

и так далее.

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

...