2015-04-04 4 views
0

У меня есть блок памяти, представленный в виде коллекции шестиугольников. Это рассматривается в формате шестнадцатеричного дампа, где значение левого столбца - это первые две шестнадцатеричные цифры смещения в этой строке. Заголовок столбца для каждого байта - это последняя цифра этого смещения. Это выглядит примерно так (я сокращенная некоторые части, чтобы сэкономить время/место):Как найти/распечатать смещение hexdump в C

0 1 2 3 ..... 9 A B .... F 
0 AD 1E 08 ...................... 
1 ....... 
. ....... 
. ....... 
9 ....... 
A ....... 
. ....... 
F ....... 
10....... 
11....... 
. ....... 
1E.. DE 
1F....... 

Я хочу, чтобы пройти через этот блок памяти для конкретного байта с помощью указателя. Затем я хочу напечатать шестнадцатеричное представление этого смещения (например, DE будет со смещением 1E1). Мой код прямо сейчас выглядит следующим образом:

uint8_t *p = baseAddr;//create a pointer that points to the first byte of memory in the array 
    for(int i = 0; i < Length; i++){//use a for loop to move p from the start to the maximum length of the specified region 
     if(*p == Byte){//if it matches the byte you're looking for 
      fprintf(Out, "%02X ", p);//print the location of the current byte 
     } 
     p++; 
    } 

Но вместо распечатки правильного значения, она выдает что-то вроде «800419B1» и дает мне предупреждение, что говорит «формат„02X“ожидает беззнаковый INT ', но Аргумент 3 имеет тип 'uint8_t *' "

Является ли смещение чем-то, что я должен отслеживать, когда я иду, или это то, что я могу получить от указателя? Если да, то как мне это сделать?

ответ

2

Вычтите базовый адрес из p, чтобы получить смещение:

fprintf(Out, "%02X ", p - baseAddr); 

Вы на самом деле не нужно p, вы можете просто использовать i:

for (int i = 0; i < Length; i++) { 
    if (baseAddr[i] == Byte) { 
     fprintf(Out, "%02X ", i); 
    } 
} 
Смежные вопросы