• ú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
    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
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    zaroven bych asi musel definovat i nejvyssi pocet znaku v patternu, protoze jinak by mi to zakonite vratilo jen cely retezec jako ze se jednou opakuje.
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    ANDY_WARHOL: vybralo by to zaroven ty nejdelsi nejdriv.
    ANDY_WARHOL
    ANDY_WARHOL --- ---
    H_U_N_T_E_R: chtel bych nejak definovat nejmensi pocet znaku v tom patternu, takze tvuj priklad bych definoval ze chci mit 2
    a pak by vystup byl jen abab - 2x
    protoze to co uz by jednou v tom paternu bylo by se uz nepocitalo znovu.
    proste vypichnout unikatni co nejdelsi sequence

    H_U_N_T_E_R
    H_U_N_T_E_R --- ---
    LOOCAS: proč to máš jako pole bytů? Pokud to není stream, tak si to stejně celý načítáš do paměti a ukládáš zpětně, pak bych použil nějakou vhodnější strukturu a custom serializaci/deserializaci. A jelikož se ti to vejde do paměti, tak rozdíl mezi zpracováním RAW pole a nějakého spojáků/něčeho jiného bude minimální.
    H_U_N_T_E_R
    H_U_N_T_E_R --- ---
    ANDY_WARHOL: co je nejdelší opakující se sekvence znaků?
    pro vstup "ababfabab" chceš mít výstup:
    abab - 2x
    ab - 4x
    a - 4x
    b - 4x

    a f protože se neopakuje tam nemít?
    Kliknutím sem můžete změnit nastavení reklam