C++;到C#代码转换类型
我正在尝试将以下内容转换为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]
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]); }