ulong* ptr als string

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    ulong* ptr als string

    Moinsen,

    Also, ich habe da letztens was ganz nettes entdeckt:



    Hier wird der string "m_pData." als ulong codiert und der pointer dazu gespeichert.
    Mittels

    C#-Quellcode

    1. string bla = new string((sbyte*)str);


    kann man den ursprünglichen String wieder zurückbekommen :)
    Ich versuche jetzt ne Funktion zu schreiben wo ich als Input einen kurzen String eingeben kann, und mir ein ulong zurückgegeben wird, welcher nach obrigem Verfahren den string ausgeben soll.Ist aber nicht ganz so leicht.
    Zum einen darf der string nicht sehr lang sein, wie lang genau weiß ich nicht aber ich glaube so an die 8-10 zeichen, - das ist aber kein Problem.
    Das knifflige ist den richtigen ulong zu generieren.

    Ich habe das ganze so aufgedröselt :



    Wenn man das ganze in ein byte array zerlegt repräsentiert jedes byte einen zugehörigen ASCII wert.
    Da ein ulong aus 8 bytes besteht nehme ich an der input string darf maximal 8 zeichen lang sein?
    Kann mir jemand helfen/erklären wie ich den richtigen ulong generiere um ihm mit oben beschriebenen Verfahren wieder zu nem string decodiere?
    Das hier ist mein Ansatz, bisschen seltsam irgendwie, der Outputstring wird reversed dargestellt :



    Lg
    Rikudo
    C# Developer
    Learning C++

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rikudo“ ()

    3daycliff schrieb:

    Zur reversed-Frage: Big/Little Endian?

    Ehm, nun das reveresed Problem konnte ich selbst lösen , - Ich musste einfahc den inputstring reversen.
    Allerdings hab ich ein noch kniffligeres Problem :
    Guck dir mal das an :



    Was ich nicht verstehe, - bei dem ersten ulong[] wird der komplette string ausgegeben, also "clrjit.dll".
    Beim zweiten ulong[] sollte also folglich eigentlich "VisualBasic" ausgegeben werden. Wird es aber nicht.
    Es wird nur "Visual" ausgegeben, warum passiert das?
    macht irgendwie keinen Sinn oder?
    C# Developer
    Learning C++
    Ehm, nun das reveresed Problem konnte ich selbst lösen , - Ich musste einfahc den inputstring reversen.
    Damit hast du es nicht wirklich gelöst...

    Es wird nur "Visual" ausgegeben, warum passiert das? macht irgendwie keinen Sinn oder?
    Tipp: Das Null-Byte hat eine besondere Bedeutung im Zusammenhang mit Strings im "C-Style"

    3daycliff schrieb:

    Ehm, nun das reveresed Problem konnte ich selbst lösen , - Ich musste einfahc den inputstring reversen.
    Damit hast du es nicht wirklich gelöst...

    Was besseres ist mir nicht eingefallen :D
    Hast du einen besseren Vorschalg? :)

    3daycliff schrieb:


    Es wird nur "Visual" ausgegeben, warum passiert das? macht irgendwie keinen Sinn oder?
    Tipp: Das Null-Byte hat eine besondere Bedeutung im Zusammenhang mit Strings im "C-Style"

    Ja, das 0-byte determiniert normalerweise das ende eines Strings in C wenn ich das richtige kapiere.
    Aber selbst wenn man die 0-bytes weglässt werden die zwei strings nicht "verbunden"..
    C# Developer
    Learning C++
    Was soll das werden? String als ulong codieren? Ein ulong hat 8 Bytes. Folglich kannste auch nur nen String mit 8 Bytes (bei ASCII 8 Zeichen) drinnen speichern. Also was soll das genau werden? Und weshalb stackalloc?


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    thefiloe schrieb:

    Was soll das werden? String als ulong codieren? Ein ulong hat 8 Bytes. Folglich kannste auch nur nen String mit 8 Bytes (bei ASCII 8 Zeichen) drinnen speichern. Also was soll das genau werden? Und weshalb stackalloc?

    Ausprobieren und Spaß haben.
    Es hat mich lediglich interessiert als ich das gesehen habe und wollte wissen wie genau
    das funktioniert, daher frage ich. Ist ja nicht verboten oder? :)
    Und stackalloc wird benötigt weil ich hier mit pointern bastle.
    nur

    C#-Quellcode

    1. ulong* bla = new ulong[2];


    wird nicht gehen ;)

    Und man kann eben auch längere strings als 8 zeichen codieren.
    In dem man das ganze eben als array macht.
    Nur bei meinem Beispiel (Visualbasic) werden die zwei strings nicht verknüpft.
    Bei dem ersten (clrjit.dll) schon .. :|
    C# Developer
    Learning C++
    Hast du einen besseren Vorschalg? Siehe Post #2.

    Aber selbst wenn man die 0-bytes weglässt werden die zwei strings nicht "verbunden"..
    Bei long und weniger als 8 Zeichen kannst du kein Byte weglassen. Wenn du es zusammen schreiben willst, musst du es richtig codieren.

    Bei reinem (7-bit) ASCII kannst du übrigens auch neun Zeichen codieren. Wenn du hier und da was weglässt auch mehr. Ist aber dann nicht mehr so schön...

    3daycliff schrieb:

    Hast du einen besseren Vorschalg? Siehe Post #2.

    Aber selbst wenn man die 0-bytes weglässt werden die zwei strings nicht "verbunden"..
    Bei long und weniger als 8 Zeichen kannst du kein Byte weglassen. Wenn du es zusammen schreiben willst, musst du es richtig codieren.

    Bei reinem (7-bit) ASCII kannst du übrigens auch neun Zeichen codieren. Wenn du hier und da was weglässt auch mehr. Ist aber dann nicht mehr so schön...

    Danke schonmal für die Antwort.
    Aber ich verstehe es nicht ganz.
    Das heißt der erste ulong im array müsste die kompletten 8 bytes füllen, richtig?
    Und um dann was dranzuhängen, wie müsste ich das dann codieren.
    Wie wäre das denn bei meinem Beispiel string?
    Ich steh ein bisschen auf dem Schlauch :D
    C# Developer
    Learning C++
    Du musst dir halb bewusst sein, dass alles was du in den Speicher von stackalloc schreibst nach dem Methodenaufruf auch wieder weg ist.
    Für Pointer ist auch nicht zwingend ein stackalloc notwendig. Du kannst prinzipiell sowieso von allem ne Adresse holen und auch casten wie du grad lustig bist ;).
    Ist aber nur in Spezialfällen notwendig. Verwende es z.B. bei CSCore sehr häufig, weil man damit Sachen machen kann die ansonsten gar nicht oder nur auf Umwegen möglich sind.

    C#-Quellcode

    1. class Foo
    2. {
    3. public unsafe static void Main(string[] args)
    4. {
    5. ulong num = ulong.MaxValue / 2;
    6. ulong* ppnum = #
    7. *ppnum = 40;
    8. Console.WriteLine(*ppnum);
    9. ulong[] numarr = { 10, 20, 30, 40, 50 };
    10. fixed (ulong* pnumarr = &numarr[0])
    11. {
    12. ulong* pnumarrcpy = pnumarr;
    13. for (int i = 0; i < numarr.Length; i++)
    14. {
    15. Console.WriteLine(*pnumarrcpy);
    16. pnumarrcpy++;
    17. }
    18. }
    19. Foo0(10, 20, out num);
    20. Console.WriteLine(num);
    21. fixed (void* pvnumarr = &numarr[0])
    22. {
    23. byte* pbnumarr = (byte*) pvnumarr;
    24. for (int i = 0; i < numarr.Length * sizeof (ulong); i++)
    25. {
    26. Console.WriteLine(*pbnumarr++);
    27. }
    28. }
    29. }
    30. private unsafe static void Foo0(ulong num0, ulong num1, out ulong res)
    31. {
    32. fixed (ulong* p = &res)
    33. {
    34. *p = num0 * num1;
    35. }
    36. }
    37. }


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @3daycliff : Okay, ich habs kapiert :D

    C#-Quellcode

    1. ulong* str = stackalloc ulong[2];
    2. str[0] = 0x61426C6175736956; // VisualBa
    3. str[1] = 0x0000000000636973; // sic.....


    sollte genauso gehen wenns 3 array items sind oder mehr... also kann man eigentlich beliebig lange strings nach diesem Verfahren codieren, stimmts?

    @thefiloe : Danke für die ausführliche Erklärung, ich werde mich nochmal einlesen :D
    C# Developer
    Learning C++
    Was heißt für dich codieren? Ein String liegt im Speicher. Machste einen Pointer drauf kannste diesen typisieren. Typisierst du ihn als byte, dann liest du den Speicher in bytes. Typ. du ihn als int, dann liest du ihn als int und sonst als long,... was auch immer du angibst. Am Speicher selbst änderst dadurch rein gar nix.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @Rikudo Du denkst etwas verquer, glaube ich.
    Falls Du Ahnung von C / C++ hast, da war solch alles ganz einfach.
    Man nehme einen Pointer auf iwas und caste den um. Das kannst Du mit .NET-Mitteln auch machen, da musst Du Dir einfach die Um-Cast-Prozeduren machen, das sind dann jeweils unsafe-Einzeiler.
    Gepaart wegen von und nach, must mal probieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wo ist die Rede von

    thefiloe schrieb:

    performance
    :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nirgends. Nur geht dir damit eine sehr wichtige Komponente von unsafe verloren. Zum einen vereinfacht Unsafe vieles und bringt dazu eine Performance-Steigerung. Wenn ich x methoden brauch um mit Pointern arbeiten zu können, welche dazu noch doppelt und dreifach über Überprüfungen abgesichert sind, dann kann ich es meistens gleich bleiben lassen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    thefiloe schrieb:

    gleich bleiben lassen
    Außer dem Üben des Castens mit unsafe seh ich in diesem Beispiel auch keinen Sinn.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!