Почему существуют и utf-16le, и utf-16be?эффективность порядка байтов - C - PullRequest
3 голосов
/ 27 июля 2010

Мне было интересно, почему существуют и utf-16le, и utf-16be? Считается ли «неэффективным» для среды с прямым порядком байтов обрабатывать данные с прямым порядком байтов?

В настоящее время это то, что я использую при локальном хранении 2-байтовой переменной:

  unsigned char octets[2];
  short int shotint = 12345; /* (assuming short int = 2 bytes) */
  octets[0] = (shortint) & 255;
  octets[1] = (shortint >> 8) & 255);

Я знаю, что при локальном хранении и чтении с фиксированным порядком байтов нет никакого риска байтов. Мне было интересно, если это считается "неэффективным"? Каков был бы самый "эффективный" способ хранения 2-байтовой переменной? (при ограничении данных порядком байтов среды, только для локального использования.)

Спасибо, Doori Bar

1 Ответ

2 голосов
/ 27 июля 2010

Это позволяет коду записывать большие объемы данных Unicode в файл без преобразования.Во время загрузки вы всегда должны проверять порядок байтов.Если вам повезет, вам не нужно преобразование.Таким образом, в 66% случаев вам не требуется преобразование, и только на 33% вы должны преобразовать.

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

Таким образом, каждый может быть настолько счастлив, насколько это возможно.

Так что в вашем случае вам нужно проверять кодировку при загрузке данных, но в ОЗУ вы можете использовать массив short intобработать его.

[EDIT] Самый быстрый способ преобразовать 16-битное значение в 2 октета:

char octet[2];
short * prt = (short*)&octet[0];
*ptr = 12345;

Теперь вы не знаете, является ли octet[0] младшим или верхним8 битЧтобы это выяснить, напишите известное значение, а затем изучите его.

Это даст вам одну из кодировок;родной для вашего процессора.

Если вам нужна другая кодировка, вы можете поменять местами октеты при записи их в файл (т.е. записать их octet[1],octet[0]) или свой код.

Если у вас есть несколько октетов, вы можете использовать 32-битные целые числа для замены двух 16-битных значений одновременно:

char octet[4];
short * prt = (short*)&octet[0];
*ptr ++ = 12345;
*ptr ++ = 23456;

int * ptr32 = (int*)&octet[0];
int val = ((*ptr32 << 8) & 0xff00ff00) || (*ptr >> 8) & 0x00ff00ff);
...