首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

求1小段C++代码转C

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

求一小段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());
        }
    }
}


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

热点排行