#c #arrays
#c #массивы
Вопрос:
Я сейчас работаю над некоторым устаревшим кодом (конвертируя часть его в C #), и я наткнулся на проблему:
Создается массив байтов (длина равна ulcLen):
CSLAutoArray<BYTE> pMem(new BYTE[ulcLen]);
Теперь некоторые данные помещаются в массив байтов, после чего предполагается, что значение CRC / Hash записывается в первые четыре байта (ULONG / UInt32):
__CfgCRC(pMem sizeof(ULONG), ulcLen - sizeof(ULONG))
->
inline ULONG __CfgCRC(const void* const cpcMem, const ULONG ulcMemSize)
{
ULONG ulRes = 0;
const BYTE* const cpcUseMem = reinterpret_cast<const BYTE*>(cpcMem);
for(const BYTE* pcLook = cpcUseMem; cpcUseMem ulcMemSize > pcLook; pcLook )
{
ulRes ^= static_cast<ULONG>(*pcLook);
//[...]
};
return ulRes;
};
Теперь, это только мне кажется, или static_cast считывает 1/2/3 байта в конце массива байтов в конце цикла for? Поскольку pcLook (указатель памяти) увеличивается до тех пор, пока не достигнет полной длины данных (ulclen sizeof(ULONG)) ? Или я ошибаюсь? Или static_cast каким-то образом не считывает конец массива? (CSLAutoArray — это какой-то класс управляемого указателя, но, насколько я вижу, он не мешает этому коду)
Ответ №1:
*pcLook
это просто BYTE
так что нет, он читает только 1 октет за раз. приведение просто приводит к BYTE
, а не к тому, на что pcLock
указывает.
Комментарии:
1. ХОРОШО!!! Итак, как он преобразует 1 байт в 4? Означает ли это, что результирующий ULONG также может иметь только максимальное значение 255?
2. обычно
BYTE
этоunsigned char
так, что он обнуляет его до размераULONG
… и да, он все равно будет иметь диапазон значений {0 … 255}.