• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    TENCOKACISTROMYProgramovani v C#, F# a dalsich jazycich pro .NET, Mono a ostatni CLI implementace
    DARKREIDER
    DARKREIDER --- ---
    na hovno uplne nie, je to free verzia toho brutalne draheho, ktory mi nejaky Ind ponukal po telefone za par tisic dolarov, ked som zverejnil pri registracii telefon :). Je dost osekana, vie len zakladne nahradenia premennych a tusim este nejaku(e) drobnost(i), na poriadne zneprijemnenie refaktoringu to nie je, ale urcite to zamlzi znatelne, vzdy lepsie ako plain kod. Len bacha na resx, tie mi to pravidelne rozosralo, takze ich vyhodit zo zoznamu obfuskovania.
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    ten je imho dost nahovno
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    Neni nejakej pribalenej primo k Visual Studiu?
    K0TEL
    K0TEL --- ---
    zdar, nějakej typ na freeware obfuscator (.net)?
    LOOCAS
    LOOCAS --- ---
    KEDRIGERN: Díky, supr! To mě předtim nenapadlo. :) Zkusim.
    KEDRIGERN
    KEDRIGERN --- ---
    Běžně se zachytává výjimka (v objektových jazycích je takové ukončení jednou za čas ok - často by to byl výkonnostní problém). Ale samozřejmě lze snadno použít čítač - délku streamu máš, tak si počítej, kolik si přečetl a pak to ukonči.

    Nicméně tu výjimku tam stejně budeš mít a jestli to nejsou stovky streamů, ale ukočení max. pár desítek streamů, tak bych šel pohodlně přes výjimku.
    LOOCAS
    LOOCAS --- ---
    Leda while "nevyhodí vyjímku", to by asi šlo.
    LOOCAS
    LOOCAS --- ---
    SHIGORBIRDMAN: Znám. :) Ale while "co"? :) Jak řikám, v Pythonu neni objekt EOF.
    KEDRIGERN
    KEDRIGERN --- ---
    KEDRIGERN: s/teytu/textu (samozřejmě)
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    LOOCAS: znas cyklus while?
    KEDRIGERN
    KEDRIGERN --- ---
    LOOCAS: Zcela normálně, jako matchování teytu. Čteš a zkoumáš, co to zrovna je a pak už to jen dočteš. V Céčku to asi ani jinak dělat nemůžeš.

    Prostě když není objekt, tak ti nic moc nepomůže.
    LOOCAS
    LOOCAS --- ---
    SHIGORBIRDMAN: No, já si myslim, že ne. Proto se tu ptám, jak. :)

    Jak postavíš loop na proměnnym počtu iterací?
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    LOOCAS: a to je takovy problem nacist si to vsechno do toho pole bajtu (jak uz to delas) a brat to z nej? to "getdata" podle toho co pises vraci pole bajtu, to je takovy problem pouzit ji misto readbytes? odnekud musis vedet kolik v tom streamu je dat, to je takovy problem si to hlidat?
    LOOCAS
    LOOCAS --- ---
    SHIGORBIRDMAN: No, problém je v tom, že ten stream je speciální cStream objekt knihovny OpenMCDF. Nemá metodu ReadBytes, má pouze metodu GetData(od, do).
    Druhá věc je ten loop while. Já nezjistim žádný EOF. v IronPythonu ani žádnej takovej objekt neni. Afaik.
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    var id = stream.ReadBytes(16);
    var lenbytes = stream.ReadBytes(4);
    long len = lenbytes[0]+lenbytes[1]*256+lenbytes[2]*256*256+lenbytes[3]*256*256*256; //teda za predpokladu, ze je to ulozene jako maly endian
    var strbytes = stream.ReadBytes(len);

    a tak dal do, to cele do while cyklu dokud neni pozice ve streamu na konci. Neni mi moc jasne, v cem je konkretne problem.
    LOOCAS
    LOOCAS --- ---
    SHIGORBIRDMAN: No, na to se právě ptám. :D Jak napsat cyklus, kterej bude procházet pole po různě dlouhejch krocích?

    16 Bytů: ID (nepotřebuju)
    4 Byty: množství dalších Bytů, ve kterejch je uloženej string (potřebuju!)
    XY Bytů (dýlka je variabilní, uložená v předchozích Bytech, podle dýlky stringu), kde je string, kterej potřebuju upravit = změnit a tim i změnit jeho dýlku, což pak musim následně zapsat do předchozích 4 Bytů
    4Byty: množství dalších Bytů, ve kterejch je uloženej string (ten nepotřebuju)
    XY Bytů, množství určeno v předchozích čtyřech Bytech

    a tohle pořád dokola, dokud jsou v poli Byty.

    Jednoduše použít for x = 0 to len(Array[Byte]) použít nemůžu, jelikož by to chodilo po jednom Bytu.
    SAJAGI
    SAJAGI --- ---
    LOOCAS: Pokud tě dobře chápu, tak bych si vytvořil vlastní implementaci stream readeru / writeru, která bude mít ReadString / WriteString, a která bude sama načítat, resp. zapisovat ty tvoje DYLKY. Takže v principu pak bys měl něco jako
    while ((string token = inputStream.ReadString()) != null) {
      var modToken = token.ToUpper(); // do something with the token
      outputStream.WriteString(modToken);
    }


    Popřípadě tedy, pokud to nechceš konvertovat do stringu, tak si to ukládej do pole bajtů.
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    LOOCAS: mas to oparvdu jako normalni stream?
    pak fakt nevidim duvod proc to neudelat jako cyklus, kdy postupne nactes 4 bajty id, 4 bajty delku stringu, tolik bajtu kolik ma mit string atd.
    LOOCAS
    LOOCAS --- ---
    H_U_N_T_E_R: Array[Byte] mi vrací metoda .GetData() na tom stream objektu, kterej potřebuju upravit. Dělám to pomocí OpenMCDF knihovny na OLE strukturovanym storage v binárnim souboru (proprietárnim).


    SHIGORBIRDMAN: No, mě jde spíš o to, že tak, jak to dělám, mám pocit, že neni úplně košer. :) Můj postup:

    1) načtu soubor
    2) vycucnu z něj ten stream objekt
    3) ze stream objektu načtu všechny Byty v pořadí do Array[Byte] objektu

    a teď ta moje prasárna:
    4) pomocí Encoding.Unicode.GetString() překlopim celej Byte Array na unicode string
    5) rozdělim si celej string na list objektů podle speciálního terminate charakteru theString.split("\x00")
    6) vyměnim řetězce v poli, který potřebuju
    7) složim zpětně string z toho pole s pomocnym terminate charakterem: "\x00".join(theList)
    8) přeložim zpět na Byte Array: Encoding.Unicode.GetBytes(theString)
    9) zapíšu do streamu
    10) přepíšu stream v souboru, commitnu a uložim na disk.

    Tomu překládání pomocí UTF-16 bych se chtěl vyhnout a řešit to na úrovni toho Byte Array, proto se ptám, jak iterovat Byte Array, když mám předem daný pravidla:

    16 Bytů - vyhrazeno pro ID
    4 Byty - délka následujícího stringu (UTF-16) (uložíme do proměnný DYLKA)
    Len(DYLKA+1)*2 - počet následujících Bytů, který nesou textovou hodnotu (UTF-16)
    4 Byty - délka násleudjícího stringu (UTF-16) (uložíme do proměnný DALSIDYLKA)
    Len(DALSIDYLKA+1)*2 - počet následujících Bytů, který nesou textovou hodnotu (UTF-16)

    (mimochodem, psaný je to v IronPythonu)
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    LOOCAS: pokud chces libovolne menit obsah toho streamu, jako ze jednotlive objekty muzou menit sve hodnoty a velikost, tak se z toho, pokud je to opravdu klasicky Stream, "pobavis".

    Asi nacist vsechno do pameti jako deserializaci objektu v linked list seznamu (za predpokladu, ze je potrea nejak poradi).
    Nebo projet cely stream a zjistit si indexy, na kterych zacinaji jednotlive objekty, a udelat si dictionary ID/index
    Kliknutím sem můžete změnit nastavení reklam