在C#中转换以下代码C ++代码 [英] Convert following code C++ code in C#

查看:66
本文介绍了在C#中转换以下代码C ++代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 bool CRegeditExport :: ExportBinaryValue(IN const LPBYTE lpBinValue,IN const DWORD nBinValueSize,IN const BYTE nRegType,IN CString strValueName,OUT CString& strRetVal)
{
/ / binary有点不同
//我们还必须保持80行每行限制字符包括值名称
/ *
如果值名称很长则在第一行后终止字节写成
将整数转换为字符串。这些函数的更安全版本可用;请参阅_itoa_s,_i64toa_s,_ui64toa_s,_itow_s,_i64tow_s,_ui64tow_s。将整数转换为字符串。这些函数的更安全版本有效;见_itoa_s= hex:12,\
22,2a,1a,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa ,aa,aa,aa,aa,aa,aa,aa,aa,\
aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa ,aa,aa,aa,aa,aa,aa,aa,cc,cc,cc,cc,\
cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc ,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
cc,cc,cc,cc,cc,cc,cc,cc ,CC,CC,CC,CC,CC ,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
cc,cc,cc,cc,cc,cc,cc,cc,cc,cc ,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
cc,cc,cc,cc,cc,cc,cc ,cc,cc,cc,cc,c0,12,22,2a,1a,aa,aa,aa,aa,aa,aa,aa,aa,aa,\
aa,aa,aa,aa ,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,\
aa ,AA,AA,AA,AA,AA,AA,AA,AA,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,\\ \\
cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc ,cc,cc,\
cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc ,cc,cc,cc,cc,cc,\
cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc ,cc,cc,cc,cc,cc,cc,cc,c0
* /

// ASSERT(CString(strValueName)!= _T(DispFileName));

ASSERT(AfxIsValidAddress(lpBinValue,nBinValueSize));
ASSERT(AfxIsValidString(strValueName));
ASSERT(_tcslen(strValueName)); //当默认值
const DWORD nBufCount = _tcslen(strValueName)+ _tcslen(_T(\\= hex :()时应为@ ?)\\ n)+(nBinValueSize * 3 / *每个字节x 2 +逗号* /)+((nBinValueSize * 6)/ 18)+ 9 / *结束行数+ crls * / ;
//分配buufer
TCHAR * buf = new TCHAR [nBufCount + 1];
ZeroMemory(buf,sizeof(TCHAR)*(nBufCount + 1));
TCHAR hexBuf [9] = {0};
CString strFormatValueName;

if((_tcslen(strValueName)< 2)&&(strValueName [0] == _T('@')))
{
// case默认值
strFormatValueName = _T(@);
}
其他
{
strValueName.Replace(_T(\\),_ T(\\\\));
strValueName.Replace(_T(\),_ T(\\\));

strFormatValueName.Format(_T(\%s \),strValueName);
}


if(nRegType == REG_BINARY)
{
_stprintf(buf,_T(%s = hex:),(LPCTSTR )strFormatValueName);
}
else
{
_stprintf(buf,_T(%s = hex(%x):),(LPCTSTR)strFormatValueName,(nRegType& 0x0F)) ;
}

DWORD nBufCurPos = _tcslen(buf);


for(DWORD i = 0; i< nBinValueSize; i ++)
{
_itot(lpBinValue [i],hexBuf,16);

//现在如果字节x小于0x0f我们有一些字符串
if(lpBinValue [i]< = 0x0f)
{
hexBuf [ 1] = hexBuf [0];
hexBuf [0] = _T('0'); //交换并为buf设置一个零之前'a'变为'0a'
}

hexBuf [2] = 0; //只需前两个字节

buf [nBufCurPos ++] = hexBuf [0]; // nBufCurPos ++;
buf [nBufCurPos ++] = hexBuf [1]; // nBufCurPos ++;

if((i + 1)< nBinValueSize)
{
buf [nBufCurPos ++] = _T(',');

//检查行结束并将crlf
if((nBufCurPos%77)< 3)
{
buf [nBufCurPos ++] = _T('\\ \\\');
buf [nBufCurPos ++] = _T('\ r');
buf [nBufCurPos ++] = _T('\ n');
buf [nBufCurPos ++] = _T('');
buf [nBufCurPos ++] = _T('');

}
}
其他
{
buf [nBufCurPos ++] = _T('\ r');
buf [nBufCurPos ++] = _T('\ n');
}

ASSERT(nBufCurPos< nBufCount);
}

if(!(buf [nBufCurPos])&&(buf [nBufCurPos - 1]!= _T('\ n')))
{
buf [nBufCurPos ++] = _T('\ r');
buf [nBufCurPos ++] = _T('\ n');
}

buf [nBufCurPos ++] = 0;

strRetVal = buf;
delete [] buf;
return(nBinValueSize< strRetVal.GetLength());
}





我的尝试:



 bool ExportBinaryValue(byte [] lpBinValue,uint nBinValueSize,byte [] nRegType,string strValueName,out string strRetVal)
{
// binary有些不同
//我们还必须保持每行80个字符限制字符,包括值名称
/ *
如果值名称非常长,则在第一个字节写入后终止
将整数转换为字符串。这些函数的更安全版本可用;请参阅_itoa_s,_i64toa_s,_ui64toa_s,_itow_s,_i64tow_s,_ui64tow_s。将整数转换为字符串。这些函数的更安全版本可用;请参阅_itoa_s = hex:12,\
22,2a,1a,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa, aa,aa,aa,aa,aa,aa,\
aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa, aa,aa,aa,aa,aa,cc,cc,cc,cc,\
cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc, cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
cc,cc,cc ,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc ,\
cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,c0,12,22,2a,1a,aa,aa,aa,aa,aa,aa ,aa,aa,aa,\
aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa ,aa,aa,aa,aa,aa,aa,\
aa,aa,aa,aa,aa,aa,aa,aa,aa,cc,cc,cc,cc,cc,cc,cc ,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc ,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
cc,cc,cc,cc,cc,cc,cc,cc,cc,cc ,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
cc,cc,cc,cc,cc,cc,cc ,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,c0
* /

// ASSERT(CString(strValueName)!= _T(DispFileName));

// ASSERT(AfxIsValidAddress(lpBinValue,nBinValueSize));
// ASSERT(AfxIsValidString(strValueName));
// ASSERT(_tcslen(strValueName)); //当默认值为
uint nBufCount =(uint)时应为@(strValueName.Length +\\= hex :( ?)\\ n.Length +(nBinValueSize * 3 / *每个字节x 2 +逗号* /)+((nBinValueSize * 6)/ 18)+ 9)/ * end + crls的行数* /;
//分配buufer
char [] buf = new char [nBufCount + 1];
// ZeroMemory(buf,sizeof(TCHAR)*(nBufCount + 1));
char [] hexBuf = new char [9];
string strFormatValueName;

if((strValueName.Length< 2)&&(strValueName [0] =='@'))
{
//默认值$的情况b $ b strFormatValueName =@;
}
其他
{
strValueName.Replace(\\,\\\\);
strValueName.Replace(\,\\\);

strFormatValueName = string.Format(\{0} \,strValueName);
}


if(nRegType == REG_BINARY)
{
_stprintf(buf,_T(%s = hex:),(LPCTSTR )strFormatValueName);
}
else
{
_stprintf(buf,_T(%s = hex(%x):),(LPCTSTR)strFormatValueName,(nRegType& 0x0F)) ;
}

int nBufCurPos = buf.Count();


for(uint i = 0; i< nBinValueSize; i ++)
{
_itot(lpBinValue [i],hexBuf,16);

//现在如果字节x小于0x0f我们有一些字符串
if(lpBinValue [i]< = 0x0f)
{
hexBuf [ 1] = hexBuf [0];
hexBuf [0] = _T('0'); //交换并为buf设置一个零之前'a'变为'0a'
}

hexBuf [2] = 0; //只需前两个字节

buf [nBufCurPos ++] = hexBuf [0]; // nBufCurPos ++;
buf [nBufCurPos ++] = hexBuf [1]; // nBufCurPos ++;

if((i + 1)< nBinValueSize)
{
buf [nBufCurPos ++] =',';

//检查行结束并将crlf
if((nBufCurPos%77)< 3)
{
buf [nBufCurPos ++] ='\\\ \\';
buf [nBufCurPos ++] ='\ r';
buf [nBufCurPos ++] ='\ n';
buf [nBufCurPos ++] ='';
buf [nBufCurPos ++] ='';

}
}
其他
{
buf [nBufCurPos ++] ='\ r';
buf [nBufCurPos ++] ='\ n';
}

// ASSERT(nBufCurPos< nBufCount);
}

if(!(buf [nBufCurPos])&&(buf [nBufCurPos - 1]!= _T('\ n')))
{
buf [nBufCurPos ++] ='\ r';
buf [nBufCurPos ++] ='\ n';
}

buf [nBufCurPos ++] = 0;

strRetVal = buf;

return(nBinValueSize< strRetVal.Length);
}

解决方案

我建​​议您为函数编写一些非常简单的测试数据。在C ++代码中尝试查看结果,而不是轻松调试问题所在的C#。



另一个有用的提示是你使用TRACE宏进行调试输出,看看发生了什么。



一个常见问题是字节大小是字符串长度的两倍。比你需要转换字符串。看一下有关编码Bitconverter

bool CRegeditExport::ExportBinaryValue( IN const LPBYTE lpBinValue, IN const  DWORD nBinValueSize, IN const BYTE nRegType, IN CString strValueName,  OUT CString &strRetVal)
{
	//binary is somewhat different 
	//we also have to keep 80 chars per line limit char including the value name 
	/*
	if a value name is very long then it is terminated after the first byte is written	
	"Converts an integer to a string. More secure versions of these functions are available; see _itoa_s, _i64toa_s, _ui64toa_s, _itow_s, _i64tow_s, _ui64tow_s. Converts an integer to a string. More secure versions of these functions are available; see _itoa_s"=hex:12,\
	22,2a,1a,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,\
	aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,cc,cc,cc,cc,\
	cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
	cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
	cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
	cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,c0,12,22,2a,1a,aa,aa,aa,aa,aa,aa,aa,aa,aa,\
	aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,\
	aa,aa,aa,aa,aa,aa,aa,aa,aa,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
	cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
	cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
	cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,c0
	*/

	//	ASSERT( CString(strValueName) != _T("DispFileName") );

	ASSERT(AfxIsValidAddress(lpBinValue, nBinValueSize));
	ASSERT(AfxIsValidString(strValueName));
	ASSERT(_tcslen(strValueName));//should be "@" when default value 
	const DWORD nBufCount = _tcslen(strValueName) + _tcslen(_T("\"\"=hex:(?)\r\n"))  + (nBinValueSize   * 3 /*each byte x 2 + comma */ ) + ((nBinValueSize *  6) / 18)  + 9/* number of lines for end  + crls*/ ;
	//allocate the buufer
	TCHAR *buf = new TCHAR[nBufCount + 1];
	ZeroMemory(buf, sizeof(TCHAR) * (nBufCount + 1));
	TCHAR hexBuf[9] = {0};
	CString strFormatValueName;

	if( (_tcslen(strValueName) < 2) && (strValueName[0] == _T('@')) )
	{
		//case of default value 
		strFormatValueName = _T("@");
	}
	else
	{
		strValueName.Replace(_T("\\"), _T("\\\\"));
		strValueName.Replace(_T("\""), _T("\\\""));

		strFormatValueName.Format(_T("\"%s\""), strValueName);
	}


	if(nRegType == REG_BINARY)
	{
		_stprintf(buf, _T("%s=hex:"), (LPCTSTR) strFormatValueName );
	}
	else
	{
		_stprintf(buf, _T("%s=hex(%x):"), (LPCTSTR) strFormatValueName, (nRegType & 0x0F) );
	}

	DWORD nBufCurPos = _tcslen(buf);


	for(DWORD   i =0; i < nBinValueSize; i++)
	{
		_itot( lpBinValue[i],hexBuf, 16  );

		//now if byte x it less than 0x0f we have prepend something to string
		if(lpBinValue[i] <= 0x0f )
		{			
			hexBuf[1] = hexBuf[0];
			hexBuf[0] = _T('0'); //swap and put one zero for buf before so 'a' becomes '0a'
		}

		hexBuf[2] = 0; //need only first two bytes

		buf[nBufCurPos++] = hexBuf[0];// nBufCurPos++;
		buf[nBufCurPos++] = hexBuf[1]; //nBufCurPos++;

		if( (i + 1) < nBinValueSize)
		{
			buf[nBufCurPos++] = _T(',');

			//check for line end and put crlf 
			if( (nBufCurPos % 77) < 3   )
			{
				buf[nBufCurPos++] = _T('\\'); 
				buf[nBufCurPos++] = _T('\r'); 
				buf[nBufCurPos++] = _T('\n'); 
				buf[nBufCurPos++] = _T(' '); 
				buf[nBufCurPos++] = _T(' '); 

			}
		}
		else
		{
			buf[nBufCurPos++] = _T('\r'); 
			buf[nBufCurPos++] = _T('\n'); 			
		}	

		ASSERT(nBufCurPos < nBufCount); 
	}

	if(!(buf[nBufCurPos]) &&  (buf[nBufCurPos - 1] != _T('\n') ) )
	{
		buf[nBufCurPos++] = _T('\r'); 
		buf[nBufCurPos++] = _T('\n'); 
	}

	buf[nBufCurPos++] = 0; 

	strRetVal = buf;
	delete [] buf;
	return (nBinValueSize < strRetVal.GetLength()) ;
}



What I have tried:

 bool ExportBinaryValue( byte[] lpBinValue, uint nBinValueSize, byte[] nRegType, string strValueName,out  string strRetVal)
{
	//binary is somewhat different 
	//we also have to keep 80 chars per line limit char including the value name 
	/*
	if a value name is very long then it is terminated after the first byte is written	
	"Converts an integer to a string. More secure versions of these functions are available; see _itoa_s, _i64toa_s, _ui64toa_s, _itow_s, _i64tow_s, _ui64tow_s. Converts an integer to a string. More secure versions of these functions are available; see _itoa_s"=hex:12,\
	22,2a,1a,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,\
	aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,cc,cc,cc,cc,\
	cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
	cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
	cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
	cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,c0,12,22,2a,1a,aa,aa,aa,aa,aa,aa,aa,aa,aa,\
	aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,\
	aa,aa,aa,aa,aa,aa,aa,aa,aa,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
	cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
	cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
	cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,c0
	*/

	//	ASSERT( CString(strValueName) != _T("DispFileName") );

    //ASSERT(AfxIsValidAddress(lpBinValue, nBinValueSize));
    //ASSERT(AfxIsValidString(strValueName));
    //ASSERT(_tcslen(strValueName));//should be "@" when default value 
	 uint nBufCount = (uint)(strValueName.Length + "\"\"=hex:(?)\r\n".Length  + (nBinValueSize   * 3 /*each byte x 2 + comma */ ) + ((nBinValueSize *  6) / 18)  + 9)/* number of lines for end  + crls*/ ;
	//allocate the buufer
	char[] buf = new char[nBufCount + 1];
	//ZeroMemory(buf, sizeof(TCHAR) * (nBufCount + 1));
	char[] hexBuf = new char[9];
	string strFormatValueName;

	if( (strValueName.Length < 2) && (strValueName[0] == '@') )
	{
		//case of default value 
		strFormatValueName ="@";
	}
	else
	{
		strValueName.Replace("\\", "\\\\");
		strValueName.Replace("\"", "\\\"");

        strFormatValueName = string.Format("\"{0}\"", strValueName);
	}


	if(nRegType == REG_BINARY)
	{
		_stprintf(buf, _T("%s=hex:"), (LPCTSTR) strFormatValueName );
	}
	else
	{
		_stprintf(buf, _T("%s=hex(%x):"), (LPCTSTR) strFormatValueName, (nRegType & 0x0F) );
	}

	int  nBufCurPos = buf.Count();


    for (uint i = 0; i < nBinValueSize; i++)
	{
		_itot( lpBinValue[i],hexBuf, 16  );

		//now if byte x it less than 0x0f we have prepend something to string
		if(lpBinValue[i] <= 0x0f )
		{			
			hexBuf[1] = hexBuf[0];
			hexBuf[0] = _T('0'); //swap and put one zero for buf before so 'a' becomes '0a'
		}

		hexBuf[2] = 0; //need only first two bytes

		buf[nBufCurPos++] = hexBuf[0];// nBufCurPos++;
		buf[nBufCurPos++] = hexBuf[1]; //nBufCurPos++;

		if( (i + 1) < nBinValueSize)
		{
			buf[nBufCurPos++] = ',';

			//check for line end and put crlf 
			if( (nBufCurPos % 77) < 3   )
			{
				buf[nBufCurPos++] = '\\'; 
				buf[nBufCurPos++] = '\r'; 
				buf[nBufCurPos++] = '\n'; 
				buf[nBufCurPos++] = ' '; 
				buf[nBufCurPos++] = ' '; 

			}
		}
		else
		{
			buf[nBufCurPos++] = '\r'; 
			buf[nBufCurPos++] = '\n'; 			
		}	

		//ASSERT(nBufCurPos < nBufCount); 
	}

	if(!(buf[nBufCurPos]) &&  (buf[nBufCurPos - 1] != _T('\n') ) )
	{
		buf[nBufCurPos++] = '\r'; 
		buf[nBufCurPos++] = '\n'; 
	}

	buf[nBufCurPos++] = 0; 

	strRetVal = buf;
	
	return (nBinValueSize < strRetVal.Length) ;
}

解决方案

I would suggest that you write some very simple test data for your funtions. Try it in your C++ code to see the results, than you can easy debug the C# where the problems are.

Another helpful tip is that you make debug output like with TRACE macro to see what is going on.

One common issue is that the byte size is double than the string length. Than you need to convert strings. Take a look at these articles about encoding and Bitconverter.


这篇关于在C#中转换以下代码C ++代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆