2016-07-04 109 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背景,我有时会发现很难看到什么可能是非常明显的一些类型!非常感谢您的帮助! –