Извлеките первые две цифры гекса (UInt32 *) и конвертируйте в int - PullRequest
0 голосов
/ 26 августа 2009

У меня есть набор шестнадцатеричных значений, хранящихся как UInt32 *

  • 2009-08-25 17: 09: 25.597 Частица [1211: 20b] 68000000
  • 2009-08-25 17: 09: 25.598 Частица [1211: 20b] A9000000
  • 2009-08-25 17: 09: 25.598 Частица [1211: 20b] 99000000

Когда я конвертирую в int как есть, я думаю, это безумные значения, когда они должны быть в диапазоне 0-255. Я думаю, что мне просто нужно извлечь первые две цифры. Как мне это сделать? Я попытался разделить на 1000000, но я не думаю, что это работает в шестнадцатеричном формате.

Ответы [ 5 ]

3 голосов
/ 26 августа 2009

Так как вы ожидаете <255 для каждого значения и только самый старший байт установлен в отправленных вами примерах данных, похоже, что ваша <a href="http://en.wikipedia.org/wiki/Endianness" rel="nofollow noreferrer"> порядковая последовательность перепутана - вы загрузили старшее порядковое число, затем интерпретировали это как порядка байтов, или наоборот, в результате чего порядок байтов в неправильном порядке.

Например, предположим, что у нас было число 104, хранящееся в 32-битной системе с прямым порядком байтов. В памяти байты будут: 00 00 00 68. Если вы загрузите это в память на машине с прямым порядком байтов, эти байты будут интерпретированы как 68000000.

Откуда вы взяли номера? Вам нужно преобразовать их в машинный порядок байтов?

2 голосов
/ 26 августа 2009

Цель C - это, по сути, C с дополнительным материалом сверху. Ваши обычные операции сдвига битов (my_int >> 24 или что-то еще) должны работать.

1 голос
/ 26 августа 2009

Это абсолютно похоже на проблему с порядком байтов. Независимо от того, действительно ли это, простой сдвиг битов должен делать работу:

uint32_t saneValue = insaneValue >> 24;
0 голосов
/ 26 августа 2009

Попробуйте использовать функцию NSSwapInt(), т.е.

int x = 0x12345678;
x = NSSwapInt(x);
NSLog (@"%x", x);

Следует напечатать & ldquo; 78563412 & rdquo;.

0 голосов
/ 26 августа 2009

Деление на 0x1000000 должно работать (то есть на 16 ^ 6 = 2 ^ 24, а не на 10 ^ 6). Это то же самое, что сдвиг битов вправо на 24 (я не знаю синтаксиса ObjC, извините).

...