c++代码转delphi代码
求助:c++代码转delphi代码
将一段c++代码转成delphi代码
共有3个方法
谢谢
------解决方案--------------------
UTF8Decode可以直接转到UTF-8
------解决方案--------------------
char* -> PChar
WideCharToMultiByte这个都是一样的
------解决方案--------------------
指针用之前分配内存,c中char*对应delphi的AnsiChar
将一段c++代码转成delphi代码
共有3个方法
- C/C++ code
int TcpByteSendRec(int iport,DWORD dwip, char *strDataOut,LPCTSTR strDataIn) { //准备发送的byte数据 char pstrOut[256]; memset(pstrOut,0,sizeof(pstrOut)); pstrOut[0]=0; pstrOut[1]=strlen(strDataIn); Gb2312ToUtf8(&(pstrOut[2]), 254, strDataIn, strlen(strDataIn)); //定义数据存放返回数据 char rebuff[256]; memset(rebuff,0,sizeof(rebuff)); //调用发送函数发送 int result=ReITCPSenByteDataReWD(iport,dwip,pstrOut,rebuff); // 这个是调用dll 不用翻译 if (result!=0) { return result; } //对接收到的数据rebuff进行解析//得到解析后数据 int rebuffLen=rebuff[1]; Utf8ToGb2312(strDataOut,rebuffLen+1,&rebuff[2],rebuffLen+1); return 0; } void Gb2312ToUtf8(char* pstrOut, u32 dwOutLen, const char* pstrIn, u32 dwInLen) { int i = MultiByteToWideChar(CP_ACP, 0, pstrIn, -1, NULL, 0); wchar_t * strSrc = new wchar_t[i+1]; MultiByteToWideChar(CP_ACP, 0, pstrIn, -1, strSrc, i); i = WideCharToMultiByte(CP_UTF8, 0, strSrc, -1, NULL, 0, NULL, NULL); if (i >= dwOutLen) { i = dwOutLen - 1; } WideCharToMultiByte(CP_UTF8, 0, strSrc, -1, pstrOut, i, NULL, NULL); delete strSrc; } void Utf8ToGb2312(char* pstrOut, u32 dwOutLen, const char* pstrIn, u32 dwInLen) { if (NULL == pstrOut) { return ; } int i = MultiByteToWideChar(CP_UTF8, 0, pstrIn, -1, NULL, 0); wchar_t * strSrc = new wchar_t[i+1]; MultiByteToWideChar(CP_UTF8, 0, pstrIn, -1, strSrc, i); i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL); if (i >= dwOutLen) { i = dwOutLen - 1; } WideCharToMultiByte(CP_ACP, 0, strSrc, -1, pstrOut, i, NULL, NULL); delete strSrc; }
谢谢
------解决方案--------------------
UTF8Decode可以直接转到UTF-8
------解决方案--------------------
char* -> PChar
WideCharToMultiByte这个都是一样的
------解决方案--------------------
指针用之前分配内存,c中char*对应delphi的AnsiChar
- Delphi(Pascal) code
procedure Gb2312ToUtf8(pstrOut: PAnsiChar; dwOutLen: Integer; const pstrIn: PAnsiChar; dwInLen: Integer); var i: Integer; strSrc: PWideChar; begin i := MultiByteToWideChar(CP_ACP, 0, pstrIn, -1, nil, 0); GetMem(strSrc, i * SizeOf(WideChar)); try MultiByteToWideChar(CP_ACP, 0, pstrIn, -1, strSrc, i); i := WideCharToMultiByte(CP_UTF8, 0, strSrc, -1, nil, 0, nil, nil); if (i >= dwOutLen) then begin i := dwOutLen - 1; end; WideCharToMultiByte(CP_UTF8, 0, strSrc, -1, pstrOut, i, nil, nil); finally FreeMem(strSrc, i * SizeOf(WideChar)); end; end; procedure TForm1.btn2Click(Sender: TObject); var sengdata: PAnsiChar; pstrOut: array[0..256] of AnsiChar; PpstrOut: PAnsiChar; rebuff: array[0..256] of AnsiChar; rebuffLen: Integer; begin sengdata := '1,0019,20120309174702,B42AA8C5A0A29AA952937FA657625A90'; FillChar(pstrOut, 256, 0); pstrOut[0] := '0'; pstrOut[1] := AnsiChar(Length(sengdata)); Gb2312ToUtf8(@pstrOut[2], 254, sengdata, strlen(sengdata)); ShowMessage(pstrOut); //这里就错误 注释同样出现错误 end;