Convertire da c++ in c#

di il
8 risposte

Convertire da c++ in c#

Ciao ragazzi, qualcuno può darmi una mano a convertire questa stringa da c++ in c# ?

gentity_s *g_entities = (gentity_s *)0x1319800;


Grazie in anticipo.

8 Risposte

  • Re: Convertire da c++ in c#

    Https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/unsafe-code-pointers/
  • Re: Convertire da c++ in c#

    Non ha molto senso accedere in memoria tramite un puntatore ad un indirizzo fisso. Molto probabilmente non è valido per il processo o non trovi quello che cerchi. Non sei in msdos
  • Re: Convertire da c++ in c#

    Buonasera, grazie per le risposte e per l' aiuto, ma non sono riuscito a risolvere. Di seguito c' è il codice che sono riuscito a convertire in c#.
    Non riesco a convertire l' ultima parte di codice e di seguito c' è anche l' errore generato da Visual Studio.

    C++:

    struct gclient_s
    {
    char unk0[0x32CC];
    char clanAbbrev[MAX_NETCLANNAME];
    char unk1[0x430];
    };

    C#:

    public class gclient_s
    {
    public string unk0 = new string(new char[0x32CC]);
    public string clanAbbrev = new string(new char[4]);
    public string unk1 = new string(new char[0x430]);
    }
    -----------------------------------------------------------------------------------------------

    C++:

    struct gentity_s
    {
    char unk0[0x158];
    gclient_s *client;
    char unk1[0x124];
    };

    C#:
    public partial class gentity_s
    {
    public string unk0 = new string(new char[0x158]);
    public gclient_s client;
    public string unk1 = new string(new char[0x124]);
    }
    -----------------------------------------------------------------------------------------------
    C++:

    struct CmdArgs
    {
    int nesting;
    int localClientNum[8];
    int controllerIndex[8];
    int argc[CMD_MAX_NESTING];
    const char **argv[CMD_MAX_NESTING];
    };

    C#:
    public class CmdArgs
    {
    public int nesting;
    public int[] localClientNum = new int[8];
    public int[] controllerIndex = new int[8];
    public int[] argc = new int[8];
    public readonly string argv = new string(new char[8]);
    }


    -------------------------------------------------------------------------------------------------
    C++:

    void ClientCommand(int clientNum)
    {
    gentity_s *ent = &g_entities[clientNum];
    if (ent->client)
    {
    if (!strcmp(SV_Cmd_Argv(3), "endround"))
    {
    RPC.......
    }
    }
    }
    }
    -----------------------------------------------------------------------------------------------

    C++:

    public void ClientCommand(int clientNum)
    {
    gentity_s ent = GlobalMembers.g_entities[clientNum];
    if (ent.client != null)
    {
    string cmdArgZero = SV_Cmd_Argv(0);
    if (SV_Cmd_Argv(3) == "endround")
    {
    RPC........
    }
    }
    }
    }


    C#:

    public void ClientCommand(int clientNum)
    {
    gentity_s ent = g_entities(clientNum);
    if (ent.client != null)
    {
    if (SV_Cmd_Argv(0) == "mr endround")
    {
    RPC........
    }
    }
    }

    -----------------------------------------------------------------------------------------------
    C++:
    public string SV_Cmd_Argv(int argIndex)
    {
    if (argIndex >= GlobalMembers.sv_cmd_args.argc[GlobalMembers.sv_cmd_args.nesting])
    {
    return "";
    }
    else
    {
    return GlobalMembers.sv_cmd_args.argv[GlobalMembers.sv_cmd_args.nesting](argIndex);//1
    }
    }

    C#:

    public string SV_Cmd_Argv(int argIndex)
    {
    if (argIndex >= GlobalMembers.sv_cmd_args.argc[GlobalMembers.sv_cmd_args.nesting])
    {
    return "";
    }
    else
    {
    return GlobalMembers.sv_cmd_args.argv[GlobalMembers.sv_cmd_args.nesting];
    }
    }

    -----------------------------------------------------------------------------------------------

    C++:

    CmdArgs *sv_cmd_args = (CmdArgs *)0x17476F4;
    gentity_s *g_entities = (gentity_s *)0x1319800;



    C#:

    public static gentity_s[] g_entities = (gentity_s*)0x1319800; //Errore CS0214 Puntatori e buffer a dimensione fissa possono essere usati solo in un contesto unsafe

    public static CmdArgs sv_cmd_args = (CmdArgs*)0x17476F4; //Errore CS0214 Puntatori e buffer a dimensione fissa possono essere usati solo in un contesto unsafe
  • Re: Convertire da c++ in c#

    Non c'è peggior sordo di chi non vuol sentire ...
  • Re: Convertire da c++ in c#

    Cosa vorresti dire oregon?? Non mi intendo molto di C++, per quello ho provato a chiedere aiuto a voi su questo forum.
  • Re: Convertire da c++ in c#

    @trash... stai facendo un 'pappocchione' di concetti incompatibili tra di loro, senza nessun senso.

    E' evidente che mancano le basi per ENTRAMBI I linguaggi.

    Quindi mettiamola in un'altro modo: C# NON POSSIEDE il concetto di puntatore/indirizzo di memoria. Questo NON VUOL DIRE che non sappia cosa sia, ma cge NON E' UN CONCETTO ACCESSIBILE all'utente.

    In C# c'e' il concetto di 'reference' che a tutti gli effetti e' un indirizzo di memoria, MA che l'utente NON PUO' MANIPOLARE IN NESSUN MODO: non si puo' sapere quanto vale, non si puo' stampare, non di puo' convertire, non di puo' assegnare. NON CI SI PUO' FARE NULLA.

    Poi c'e' tutta la questione della DIMENSIONE in byte di un dato: anche qui I due linguaggi differiscono in molti aspetti rendendoli FONDAMENTALMENTE INCOMPATIBILI a dispetto di una sintassi somigliante. E' un po' come un'automobile a benzina e diesel: NON PUOI riempire il serbatoio con la prima cosa che ti capita!

    Poi ci sono tecniche decisamente avanzate che permettono di far convivere puntatori C con C#, MA richiedono tutta una serie di accorgimenti abbastanza incasinati SIA a livello di scrittura del codice SIA a livello di direttive del compilatore. Ma chi kevusa, SA ESATTAMENTE che cosa sta facendo.

    TUTTO il codice postato, NON HA SENSO, anche escludendo le parti evidentemente non implementate.

    Tu dirai: ok, allora spiegami gli errori.

    I'll problema sta' proprio qui! Per spiegarti gli errori e la soluzione serve un background che richiede diversi mesi di studio!

    Tu dirai: esagerato.
    La risposta e': prenditi un libro per linguaggio e studiati la dimensione dei tipi primitivi e degli array/vettori di tipi primitivi e scrivi quanti byte sono richiesti per:

    C/C++: char, char[10], char*, wchar_t, wchar_t[10] wchar_t*
    C#: char, char[10], string
  • Re: Convertire da c++ in c#

    La faccenda principale è che tu vuoi puntare ad un indirizzo preciso di memoria in cui ammesso che riesci non troverai quello che pensi di trovare. Accedere ad un indirizzo preciso non ha senso in win32. Non ci troverai il gioco per creare il tuo cheat.
  • Re: Convertire da c++ in c#

    E qui, come dice qualcuno, ci andrebbe il mega spiegone di che cosa e' un processo, del fatto che OGNI processo ha un SUO spazio di indirizzamento, che non e' visibile agli altri processi, che il Sistema Operativo, PROPRIO per evitare i pasticci con gli indirizzi di memoria prevedibili, carica le DLL ad un indirizzo CASUALE, che per accedere all'indirizzo di memoria di un'altro processo, lo devi chiedere ESPLICITAMENTE al SistemaOperativo, e altri 500 milioni di dettagli ESTREMAMENTE complicati
Devi accedere o registrarti per scrivere nel forum
8 risposte