发布时间: 2013-11-30 22:36:00 作者: rapoo
求一小段C++代码转C#没做过C++的,没能力自己转。。。在网上找过一些C++转C#,转了不好使。希望有高人帮忙手工转换一下,谢谢!
//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);
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()); } }}
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()); } }}
一个基于asp和C#的网站已经上线为
C# 频繁向Excel表格中累加数据
C#下这种效果的注释应该如何实现
有图片做一个N皇后有关问题的网页
【叫小弟我猫爷_】Linq多字段分组.
求免费图表控件解决思路
vs2012上轮换空行的正则表达式
C# 继承WinForm 窗体控件属性不可修
COM组件是什么解决办法
怎么取出数据库某int类型的列全部之和