Dobry večer, Mam dotaz kda tady nekdo skoušel implementovat protokol SLIP v C# či už pro seriovu komunikaci alebo jine druhy komunikace. Jedna sa o prehledavani pola(stringu) a hledani určitych znaku v HEX. Mam problem jakym štilem pracovas s hex stale mi to prekodovava do divneho microsoft kodovana. Za každu radu dekuju.
Fórum › .NET
C# SLIP protokol, praca s string
#1 TD
Jeli tím myšleno https://cs.wikipedia.org/wiki/SLIP :
C# String obsahuje text ve formátu unicode, tady to asi není uplně dobrá volba, ten slip může obsahovat cokoliv(nejen text) a navíc jsou tam ty náhrady znaků. To nemůže dělat dobrotu.
Asi by bylo s tím na začátku a pracovat v poli byte[].
Tedy, načtení dat, vyhledání koncové značky a provedení náhrady ESC sekvencí. Teprve potom bych se rozhodoval jestli danný telegram převést na string.
To finální převedení na text má samozřejmně smysl jenom pokud víš že v tom telegramu je uložen text a víš v jakém je kódování, pro UTF8 se dá použít např System.Text.Encoding.UTF8.GetString(..)
To je dobra myšlenka dekuju moc :) a ked mi budu chodit do serivke ruzne dlhe data tam tam mam napevno vytvorene pole o velkosti 15 napr a ked mi dojde "ahoj" tak jak spravym aby mi stale nechodil po prekodovani stakyto sting "ahoj000000000" ?? Dekuju
#3 TD
Jak psal q, v tom bufferu(byte[]) si najdes konec telegramu a tak budes vedet jak ma byt text dlouhy.
Take je dobre si udrzovat kolik dat se do toho bufferu zapsalo(a nova data pridavat na konec. Kdyz najdes konec telegramu tak si ten pocet nactenych dat vynulujes(nebo pokud budes mit za koncem jeste nejaka data tak je presunes na zacatek pole a upravis delku a znovu zkontrolujes jestli tam neni dalsi telegram ...))
Ta funkce pro převod na text má více variant vstupních parametrů, jedna z nich umožňuje zadat i počáteční index a počet bajtů tim vytvoris text jen z toho co ma opravdu text byt.
Pokud se jedná o velikost vstupního bufferu, tak pokládám za lepší mít předem alokovanou rozumnou velikost než při každém příjmu alokovat nový buffer(což může v závislosti na tom z čeho čteš a jak data dále používáš může vést k nepěknému chování ve spojitosti s garbagekolektorem případně piningem).
Navíc pokud to opravdu nevíš jak může být vstup velký tak můžeš po naplnění bufferu použít resize nebo udělat nový větší(s rezervou) buffer a data do něj překopírovat, a starý buffer zahodit.
#5 Ovrscout
Diky moc :) toto fungovalo prerfektne ked sem to aplikoval na seriovou komunikaci ale teraz mam trocha problem s Stream pri TCP komunikaci. Ked si vytvorim StreamWrite a StreamRead každy premenu zvlašt a do oboch napišem client.getstream(); tak to jede v pohode ale potom nemozem posilat a primat pole byte. Jedine pole chat alebo string a temu sa chcem vzhnut z duvodu ich kodovana. ale ked si vytvorim podla tohoto : https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.getstream(v=vs.110).aspx
tak potom mi to vzhadzuje chybu : Operace není povolena na soketech, které nejsou připojen. popripade 6e neni vztvořen nejakej objekt. Diky za každou radu
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Kontrola zda string obsahuje jiný string — založil beachboy
String to hex ebo Byte()"string" — založil Roman Uherek
Protokol třídy — založil Vyhulman
ICQ = protokol??? — založil master
CCTalk protokol — založil x-time
Moderátoři diskuze