2014-07-02 28 views
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是某种管理指针类,但据我看它不会干扰此代码)

回答

3

*pcLook只是一个​​所以不,它一次只读取1个八位字节。演员只投了​​而不是pcLock指向的内容。

+0

OKAY !!!那么它如何将1个字节投射到4?这意味着所得到的ULONG也只能有最大值255? – pixartist

+1

通常'BYTE'是'unsigned char',所以它将零扩展为'ULONG'的大小......是的,它的值范围仍然是{0 ... 255}。 – mark