2014-07-02 29 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