2016-07-04 107 views
1

我想將以下內容轉換爲C#,但我沒有得到預期的結果。C++到C#代碼轉換類型

C++代碼:

DWORD CCSKW::GetCS(CString strFile) 
{ 
    try 
    { 
     CFile file(strFile, CFile::modeRead); 
     WORD wTemp = 0; 
     WORD wCS = 0; 

     const UINT uiMaxCharRead = 2000; 
     TCHAR c[uiMaxCharRead]; 
     UINT uiCharRead; 

     #ifdef _UNICODE 
      while(uiCharRead = file.Read(c, uiMaxCharRead)) 
      { 
       for(UINT i=0; i < uiCharRead; i++) 
        wCS ^= c[0]; 
      } 
     #else 
      while(uiCharRead = file.Read(c, uiMaxCharRead)) 
      { 
       for(UINT i=0; i < uiCharRead-1; i++) 
       { 
        wTemp = c[i]; 
        i++; 
        wTemp <<= 8; 
        wTemp += c[i]; 
        wCS ^= wTemp; 
       } 
      } 
     #endif 
     file.Close(); 
     return (DWORD)wCS; 
    } 
    catch(CFileException *e) 
    { 
     e->ReportError();   
     e->Delete();     
    } 
    return 0; 
} 

簡單地說一下這個代碼的作用是讀取二進制文件的值,並返回。該值然後用於校驗和計算方法。

我的C#代碼:

public UInt32 GetCS() 
{ 
    try 
    { 
     ushort wTemp = 0; 
     ushort wCS = 0; 
     byte[] buffer = new byte[2000]; 

     int count; 
     using (FileStream fs = new FileStream(csFile, FileMode.Open)) 
     { 
      while ((count = fs.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       for (int i = 0; i < count - 1; i++) 
       { 
        wTemp = buffer[i]; 
        i++; 
        wTemp <<= 8; 
        wTemp += buffer[i]; 
        wCS ^= wTemp; 
       } 
      } 
     } 
     return Convert.ToUInt32(wCS); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex); 
    } 
    return 0; 
} 

我知道這可能是很難幫助不知道所有的代碼,但我只是想知道如果我在正確的軌道,或者如果我已經取得了一些明顯錯誤。

謝謝!

+0

C#字符是Unicode。 –

+0

我不確定這是否是您的問題,但爲了以防萬一想要引起您注意,在C#(和.NET中的所有字符串)中,所有字符串都是**總是**以UTF16編碼 – mvidelgauz

+0

您可以共享二進制文件文件爲例? – aloisdg

回答

1

這裏的問題是C++代碼使用TCHAR,它是一個帶符號的8位類型,但C#代碼使用的是byte,它是一個無符號的8位類型。

這意味着這行代碼:

wTemp += buffer[i]; 

將總是增加的wTemp值在C#代碼,因爲buffer[i]是無符號的,但在C++代碼它將降低wTemp的值的buffer[i] >= 0x80值。

你可以通過改變出錯行來解決這個問題:

unchecked { wTemp = (ushort)(wTemp + (sbyte)buffer[i]); } 

這樣做之後,你的樣本文件會產生0x3336結果,符合市場預期。

+0

太好了!來自純Web網頁的JavaScript背景,我有時會發現很難看到什麼可能是非常明顯的一些類型!非常感謝您的幫助! –