2013-05-18 2 views
-1

У меня есть некоторый частичный исходный код, который я пытаюсь полностью восстановить (не спрашивайте, где находится остальное, его недоступно), и я в настоящее время застрял в отсутствующем методе 'endianconvert'C++ отсутствует метод endianconvert

У меня нет большого опыта работы с C++, поэтому я надеюсь, что кто-то здесь может мне помочь. Heres вызов функции

endianConvert (reinterpret_cast<DWORD *>(pData+dwClassOffset), sizeof (PageTable) >> 2); 

PDATA является BYTE массив заполнен содержимым файла

BYTE * pData = new BYTE[l]; 

dwclassoffset является текущее местоположение в файле

DWORD dwClassOffset = 0; 

и PageTable класс содержащий несколько переменных DWORD.

Это похоже на то, что мне нужно поменять endianess нескольких DWORDS в массиве BYTE, но я не знаю, как начать реализацию этого, любая помощь очень ценится.

ответ

1

Выражение >> 2 делит размер объекта в байтах на 4, что дает вам количество 4-байтовых слов, чтобы преобразовать, поэтому начать с функцией, которая делает что-то что много раз:

void endianConvert(DWORD* data, size_t count) 
{ 
    for (size_t n = 0; n < count; ++n) 
     /* convert data[n] */; 
} 

Теперь вы должны быть в состоянии поменять порядок следования байтов из одного типа DWORD, который довольно прост:

DWORD& d = data[n]; 
DWORD b1 = d & 0x000000ff; 
DWORD b2 = d & 0x0000ff00; 
DWORD b3 = d & 0x00ff0000; 
DWORD b4 = d & 0xff000000; 
d = (b1 << 24) | (b2 << 8) | (b3 >> 8) | (b4 >> 24); 

Extract каждый байт, а затем переместить его в положение, он имел бы в другой порядок байтов, и OR байты вместе.

3

Скорее всего, функция endianConvert преобразует 32-разрядные целочисленные значения из файла в 32-разрядные целочисленные значения в памяти. Чтобы реализовать его, вы должны знать, какой endian используется в файле, а также какой endian используется на целевой машине. Если их блефускианские одинаковы, то endianConvert должен просто оставить массив как, в противном случае он должен сделать что-то вроде

uint32_t dw = *dword_ptr; 
// flip bytes 
dw = (dw >> 24) | ((dw >> 8) & 0xff00) | ((dw << 8) & 0xff0000) | (dw << 24); 
*dword_ptr = dw; 

для каждого типа DWORD в массиве.

+0

Спасибо, файл большой endian, и машина немного ориентирована, если это имеет значение. – Twisted89