Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;到C#代码转换类型_C#_C++ - Fatal编程技术网

C++;到C#代码转换类型

C++;到C#代码转换类型,c#,c++,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]

我正在尝试将以下内容转换为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;
}
DWORD CCSKW::GetCS(CString strFile)
{
尝试
{
CFile文件(strFile,CFile::modeRead);
单词wTemp=0;
字wCS=0;
const UINT uiMaxCharRead=2000;
TCHAR c[uiMaxCharRead];
UINT-uiCharRead;
#ifdef_UNICODE
while(uiCharRead=file.Read(c,uiMaxCharRead))
{
对于(UINT i=0;i
简单地说,这段代码的作用是从二进制文件中读取一个值并返回它。然后将该值用于校验和计算方法

我的C#代码:

public UInt32 GetCS()
{
尝试
{
ushort-wTemp=0;
ushort-wCS=0;
字节[]缓冲区=新字节[2000];
整数计数;
使用(FileStream fs=newfilestream(csFile,FileMode.Open))
{
而((count=fs.Read(buffer,0,buffer.Length))>0)
{
对于(int i=0;i这里的问题是C++代码使用的是代码> TCHAR> <代码>,这是一个有符号的8位类型,但是C代码是使用代码>字节< /C> >,这是一个无符号的8位类型。
这意味着这行代码:

wTemp += buffer[i];
在C++代码中,将始终增加<代码> WTEMP < /COD>的值,因为缓冲区[i] 是未签名的,但是在C++代码中,将减少<代码> VTEMP <代码>的值,用于<代码>缓冲区[i] >0x80 < > 您可以通过将有问题的行更改为:

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

完成此操作后,您的示例文件将产生预期的结果
0x3336

C#字符是Unicode。我不确定这是否是您的问题,但为了以防万一,我想提请您注意在C#(和.NET一般情况下)所有字符串都是用UTF16编码的。例如,您可以共享一个二进制文件吗?如果您只想读取一个二进制文件,那么使用
byte[]data=file.ReadAllBytes(“myfile.bin”)怎么样;
?@Paulstellian不仅仅是unicode,特别是utf16,正如我在评论中提到的,太棒了!来自纯web javascript背景,有时我发现很难看到某些人在类型方面非常明显的东西!非常感谢您的帮助!
unchecked { wTemp = (ushort)(wTemp + (sbyte)buffer[i]); }