读书人

求1小段C++代码转C

发布时间: 2013-11-30 22:36:00 作者: rapoo

求一小段C++代码转C#
没做过C++的,没能力自己转。。。
在网上找过一些C++转C#,转了不好使。
希望有高人帮忙手工转换一下,谢谢!

直接弄成dll调用
[解决办法]
多一行

//BYTE Data[sizeof(JJ_HEADER)+8] = {0};

int lengthOfData = Marshal.SizeOf(typeof(JJ_HEADER_tag)) + 8;
Byte[] DATA = new Byte[lengthOfData];
Array.Clear(DATA, 0, DATA.Length);



[解决办法]
没必要转换,直接封装到C++/CLR里面去即可,先确保新建的C++/CLR项目里添加了这些代码后能正常编译,然后写与CLR交互的部分,也就是参数和返回值的交互。
[解决办法]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
[StructLayout(LayoutKind.Sequential, Pack=4)]


public class JJ_HEADER_tag
{
public uint Time { get; set; }
public uint Index { get; set; }
public uint Command { get; set; }
public uint Option { get; set; }
public uint UNK { get; set; }
public uint DataLength { get; set; }
}

class Program
{
static void Main(string[] args)
{
PacketData();
Console.ReadLine();
}

static uint m_PacketIndex = 0x00000000;

static int PacketData()
{
JJ_HEADER_tag header = new JJ_HEADER_tag();
int nLen = Marshal.SizeOf(typeof(JJ_HEADER_tag)) + 8;
header.Time = 0;
header.Index = m_PacketIndex++;
header.Command = 0x44C;
header.Option = 0x24800;
header.DataLength = 8;
byte[] data = new byte[nLen];
string sTemp = DataToString(header);
data = Encoding.Default.GetBytes(sTemp);
return XorEncrypt(data, nLen);
}

static int XorEncrypt(byte[] data, int len)
{
if (len > 0x14)
{
string str = System.Text.Encoding.ASCII.GetString(data);
JJ_HEADER_tag header = StringToData(str);
if (header.DataLength > 0 && ((header.Option & 0x40000000) == 0x00000000))
{
header.Option
[解决办法]
= 0x40000000;

GCHandle hObject = GCHandle.Alloc(data, GCHandleType.Pinned);
IntPtr pData = hObject.AddrOfPinnedObject();
pData += Marshal.SizeOf(typeof(JJ_HEADER_tag));
printPackets("pData", pData, len);

for (uint i = 0; i < header.DataLength; i++)
{
byte key = data[(header.Index ^ i) % 4];
data[i] ^= key;
}
}
}
return 0;


}

static JJ_HEADER_tag StringToData(string ss)
{
if (ss != null)
{
string[] arrTemp = ss.Split('\t');
if (arrTemp != null && arrTemp.Length > 5)
{
JJ_HEADER_tag data = new JJ_HEADER_tag();
string sTime = arrTemp[0];
data.Time = UInt32.Parse(sTime);
string sIndex = arrTemp[1];
data.Index = UInt32.Parse(sIndex);
string sCommand = arrTemp[2];
data.Command = UInt32.Parse(sCommand);
string sOption = arrTemp[3];
data.Option = UInt32.Parse(sOption);
string sUNK = arrTemp[4];
data.UNK = UInt32.Parse(sUNK);
string sDataLength = arrTemp[5];
data.DataLength = UInt32.Parse(sDataLength);
return data;
}
}
return null;
}

static string DataToString(JJ_HEADER_tag data)
{
if (data != null)
{
StringBuilder strBuilder = new StringBuilder();
strBuilder.Append(data.Time.ToString() + "\t");
strBuilder.Append(data.Index.ToString() + "\t");
strBuilder.Append(data.Command.ToString() + "\t");
strBuilder.Append(data.Option.ToString() + "\t");
strBuilder.Append(data.UNK.ToString() + "\t");
strBuilder.Append(data.DataLength.ToString());
return strBuilder.ToString();
}
return "";
}

static void printPackets(string sData, IntPtr pData, int len)
{
Console.WriteLine(sData+"\t"+pData.ToString()+"\t"+len.ToString());
}
}
}


测试过了,没问题。你再看看是不是符合需求吧。

读书人网 >C#

热点推荐