Nargon píše:Tak jsem luštil ten tvůj kód. Z toho co jsem vysledoval, tak by to mělo odchytávat takovýto kód:
- Kód: Vybrat vše
0x01 0x00 0x00 0x00 NazevPromene 0x0a 0x00 0x00 0x00 0x00 0x01 0x30 0x41 0x00 4ByteData1 4ByteData2 4ByteData3 4ByteData4 TextData 0x0a
S tím že "NazevPromene" a "TextData" jsou variabilní a předem neznámé délky.
Pak "NazevPromene" musí obsahovat jen znaky A-Z, a-z, 0-9, a podtržítko _, cokoliv jiného není povolené.
Data1 až Data4 jsou vždy o délce 4Byty.
Je to tak správně a je to vše? To abych nevymýšlel něco podle špatného zadání. Určitě se to dá nějakým způsobem optimalizovat. Ale než se nad tím zamyslím tak chci vědět že nebudu věnovat čas něčemu špatnému.
Jop, vysledoval jsi to správně (+ první znak u proměnné nesmí být číslo). Když to trochu rozvedu...
Počáteční sekvence
0x01 0x00 0x00 0x00 je vždycky před
NazevPromenne, ale nemusí nutně značit, že tam ta proměnná bude. Jsou tam i nějaký jiný data, kde se tyhle sekvence také objevují. Proto hned tak přísně validuji, že se jedná o proměnnou, abych případně mohl zahlásit false positive a jet od začátku.
Dále název proměnné i případný text vždy končí tím
0x0a. Text může být v podstatě cokoliv, ale bývá tam hlavně windows-1250 a windows-1251.
Ta následující sekvence 4x
0x00 tam bohužel není vždy. Ještě jsou tam pro jiný typy (viz dále) tvary
0x02 0x00 0x00 0x00 a
0x07 0x00 0x00 0x00 (a možná ještě něco). I v tomhle místě je ale ještě potřeba detekovat počáteční sekvenci
0x01 0x00 ..., protože pořád není jistota, že jde o správný data
.
No a pak je tam konečně sekvence, která určuje typ proměnné. Tři nejdůležitější jsou tyto
0x01 0x20 0x40 0x00 = var int
0x01 0x20 0x41 0x00 = const int
0x01 0x30 0x41 0x00 = const string
ale časem tam chci mít ještě podporu pro float, RGB barvu a několik dalších, takže bych minimálně tuhle část potřeboval nějakou rozšiřitelnou.
Pak jsou tam různý custom hodnoty podle typu, ale to už je v pohodě, protože vím na čem jsem. Sekvence pak vždy končí čtveřicí
0xff 0xff 0xff 0xff.
Jinak chci ty data vracet průběžně jak to mám teď. Budu s tím dělat ještě nějaký čachry pomocí LINQ a ani je třeba nebudu potřebovat načíst všechny. V předpisu metody bude jako návratová hodnota nějaký předek či interface.
Ale spíš než funkční implementace mi stačí nějaké typy jak na to v úhlednějším stylu, ale abych zároveň zachoval rychlost, která je tu důležitá.
gandor píše:Regexp v binarnom subore nebude nejak velmi pouzitelny. Ale pokial su tahane data dostatocne strukturovane, tak by to mohlo zjednodusit vec. Urcite ale nie grep ktory vytahuje cely riadok (co je riadok v binarnom subore?) ale skvor nejaky "tradicny" regexp z "normalnych" jazykov....
No když jsem se těmi daty prokousával, tak jsem si na to nějaký Regex napsal. Např. na tu sekvenci, kterou hledám v mé prvotní implementaci funguje v Sublime Text docela dobře
- Kód: Vybrat vše
(?s)\x01\x00\x00\x00([ -˙]*?)\x0a\x00{4}\x010A\x00(.{4}).{4}\x01\x00\x00\x00.{8}([ -˙]*?)\x0a˙˙˙˙
+ bych tam ještě musel dopsat nějaký validace. Min. v Sublime Text je to ale hodně pomalý, asi hodně hodně hodně těžko bych do toho regexu narval všechny ty hledaný sekvence a pak taky C# pracuje s UNICODE a nevím nevím, jak by se mu líbily ty binární data, který bych mu podstrčil jako string. Navíc bych to nejspíš zase musel celý nahrát do paměti.
Jinak jak jsi to myslel s těmi třídami a stavy? Co jsem si kreslil na papír cca stavovej automat, kterej odpovídá celýmu řešení, tak je tam těch stavů opravdu hodně. Na to asi tolik tříd definovat nebudu
.