Как значения хранятся в шортах C без знака? - PullRequest
1 голос
/ 27 октября 2010

Я пытаюсь прочитать двоичный файл в структуру C #.Файл был создан из C, и следующий код создает 2 байта из 50+ строк байтов.

unsigned short nDayTimeBitStuffed = atoi( LPCTSTR( strInput) );
unsigned short nDayOfYear         = (0x01FF & nDayTimeBitStuffed);
unsigned short nTimeOfDay         = (0x01F  & (nDayTimeBitStuffed >> 9) );

Двоичные значения в файле: 00000001 и 00000100.

Ожидаемые значения - 1 и 2, поэтому я думаю, что происходит некоторое упорядочение / замена битов, но я не уверен.

Любая помощь будет принята с благодарностью.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 27 октября 2010

Ответ - «это зависит» - прежде всего от машины, а также от того, как данные записываются в файл. Рассмотрим:

unsigned short x = 0x0102;
write(fd, &x, sizeof(x));

На некоторых машинах (Intel) младший байт (0x02) будет записан перед старшим байтом (0x01); на других (PPC, SPARC) старший байт будет записан перед младшим.

Итак, на машине с прямым порядком байтов (Intel) вы увидите байты:

0x02 0x01

Но на машине с прямым порядком байтов (PPC) вы увидите байты:

0x01 0x02

Ваши байты выглядят как 0x01 и 0x04. Ваш расчет для 0x02 выглядит некорректно.

Код C, который вы показываете, ничего не пишет. Значение в nDayOfYear - это 9 младших бит входного значения; nTimeOfDay представляется следующими 5 битами (поэтому используются 14 из 16 битов).

Например, если значение в strInput равно 12141 десятичному, 0x2F6D, то значение в nDayOfYear будет 365 (0x16D), а значение в nTimeOfDay будет 23 (0x17).

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

0 голосов
/ 27 октября 2010

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

Я предполагаю, что здесь машина Windows, которая использует 2 байта для короткого замыкания и помещаетони в порядке байтов.

Ваши комментарии тоже не имеют особого смысла.Если это два байта, то он должен использовать два символа, а не шорты.Диапазон первого будет 1-365, поэтому ему определенно нужно больше, чем один байт для представления.Я собираюсь предположить, что вы хотите первые 4 байта, а не первые 2.

Это означает, что первый байт будет битами 0-7 DayOfYear, второй байт будет битами 8-15DayOfYear, третий байт будет битами 0-7 TimeOfDay, а четвертый байт будет битами 8-15 TimeOfDay.

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