Извлеките первые две цифры HEX (UINT32 *) и преобразуйте в Int

StackOverflow https://stackoverflow.com/questions/1331679

Вопрос

У меня есть куча шестнадцатеричных значений, хранящихся как 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, но я не думаю, что это работает в HEX.

Это было полезно?

Решение

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

Другие советы

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

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

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

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

uint32_t saneValue = insaneValue >> 24;

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

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

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

Должен печатать «78563412».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top