0
我在一些遗留代码一起工作,现在(的一些将其转换为C#),和我在一个偶然的问题:遗留代码似乎有溢出,我不知道,虽然
一字节数组被创建(长度为ulcLen):
CSLAutoArray<BYTE> pMem(new BYTE[ulcLen]);
现在一些东西放入字节数组,在这之后,CRC /散列值应该被写入到第一个四个字节(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是某种管理指针类,但据我看它不会干扰此代码)
OKAY !!!那么它如何将1个字节投射到4?这意味着所得到的ULONG也只能有最大值255? – pixartist
通常'BYTE'是'unsigned char',所以它将零扩展为'ULONG'的大小......是的,它的值范围仍然是{0 ... 255}。 – mark