[c#] ASCII characters gebruiken

Pagina: 1
Acties:

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 15-04 15:52
Hallo,

Ik ben met een oefen projectje bezig en ik probeer een connectie naar een irc server te maken. Dit gaat opzich prima alleen nu vraagt de server op een gegeven moment een VERSION aan mij.

Ik return een version, alleen nu vertelde iemand mij dat de reply van version vooraf gegaan moet worden door het ASCII character \001.

dus mijn vraag is, hoe kan ik in .NET een \001 omzetten naar een ascii character of hoe kan ik mijn character encoding aanpassen.

Ik ben al een tijdje aan het zoeken maar ik kom er toch niet helemaal uit...

code:
1
writer.WriteLine("NOTICE "+ sender +" : \001VERSION botherman:14:c#\001");


Dus die \001 moeten vervangen worden voor het ascii teken maar ik weet niet hoe...

(als ik in een ascii tabel kijk bij 1 dan zie ik een leeg vakje)

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:54
Je kan aan de constructor van een streamwriter een encoding meegeven.

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Je kan een integer casten naar een character:

C#:
1
writer.WriteLine("NOTICE {0} : {1}VERSION botherman:14:c#{1}", sender, (char)001);

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

whoami schreef op vrijdag 21 januari 2005 @ 09:14:
Je kan aan de constructor van een streamwriter een encoding meegeven.
Maar dan vervangt hij de \001 toch nog niet. Hiermee geeft je alleen de encoding aan van de string. Meer niet.

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 15-04 15:52
wat is het verschil dan als ik een encoding zou veranderen naar ascii (ik zie tijdens het debuggen dat de stream utf-8 is)?

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

4of9 schreef op vrijdag 21 januari 2005 @ 09:24:
wat is het verschil dan als ik een encoding zou veranderen naar ascii (ik zie tijdens het debuggen dat de stream utf-8 is)?
Dat je encoding ASCII is. Er zijn verschillende Encodings, kijk is naar System.Text.Encoding (uit me hoofd) hier vind je de onderanderen ook de ASCII encoder.

Op MSDN staat hierbij ook nog een stukje uitgelegd wat het allemaal inhoud.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
UTF-8 is een superset van ASCII, daar hoef je je dus niet druk om te maken. Alle ASCII karakters hebben exact dezelfde representatie in UTF-8.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Als je op deze pagina had gekeken, dan zag je dat c# in tegenstelling tot c geen octale escape codes kent (zoals '\001').
Je kunt wel de hexadecimale escape code gebruiken. Deze wordt in jouw geval '\x1'.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

MSalters schreef op vrijdag 21 januari 2005 @ 10:03:
UTF-8 is een superset van ASCII, daar hoef je je dus niet druk om te maken. Alle ASCII karakters hebben exact dezelfde representatie in UTF-8.
Alleen de low-ASCII karakters. high-ASCII (dus 128 en hoger) worden in utf-8 wel encoded. Dus als je alsnog de letterlijke ASCII-representatie wil gebruiken, moet je Encoding.ASCII gebruiken.

日本!🎌


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 15-04 15:52
dank word hier al heel wat wijzer van.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Daos schreef op vrijdag 21 januari 2005 @ 11:06:
Als je op deze pagina had gekeken, dan zag je dat c# in tegenstelling tot c geen octale escape codes kent (zoals '\001').
Je kunt wel de hexadecimale escape code gebruiken. Deze wordt in jouw geval '\x1'.
Ik moet eerlijk toegeven dat ik hier ook lang naar gezocht heb toen ik een tijdje terug m'n C++ IRC-bot aan het porten was naar C# :X Maar dat is dus idd de oplossing, dat je hardcoded een byte 1 moet meegeven heeft niets van doen met encodings, en met hex-encoding werkt je CTCP perfect kan ik getuigen :)

Professionele website nodig?


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 15-04 15:52
hmm ik kan geen (char) \x1 doen :?

heb nu
code:
1
2
3
4
5
6
7
8
9
writer.WriteLine("NOTICE {0} :{1}VERSION botherman{1}", sender, "\x1");

en

writer.WriteLine("NOTICE {0} :{1}VERSION botherman{1}", sender, (char)001);

en

writer.WriteLine("NOTICE {0} :{1}VERSION botherman{1}", sender, (char)1);


gedaan maar alles resulteerd in dezelfde error :(

(":iuturna.sorcery.net NOTICE AUTH :*** Your IRC software has failed to respond properly to the client check.")

er gaat dus iets fout waarschijnlijk met dat ascii gebeuren....

hmmm een writer.Flush() kan ook wel eens helpen |:(

[ Voor 111% gewijzigd door 4of9 op 21-01-2005 14:47 ]

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

4of9 schreef op vrijdag 21 januari 2005 @ 14:18:
hmm ik kan geen (char) \x1 doen :?
Nee, dan word het:

C#:
1
writer.WriteLine("NOTICE {0} :{1}VERSION botherman{1}", sender, (char)0x1));


Connect is naar een socket die jezelf kan uitlezen, kun je gewoon zien wat je binnen haalt. Lijkt mij beter om te testen.

Je kan ook even je string printen of bekijken in de debugger wat de waarde is/word.

C#:
1
2
string toSend = "NOTICE {0} :{1}VERSION botherman{1}", sender, (char)0x1)
writer.WriteLine( toSend );


Zet dan even een breakpoint bij toSend en bekijk wat de waarde is.

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 15-04 15:52
het werkt al!

was de flush() vergeten (eerste keer met sockets werken)

kan nu connecten enzo.

thx!

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

4of9 schreef op vrijdag 21 januari 2005 @ 15:15:
het werkt al!

was de flush() vergeten (eerste keer met sockets werken)

kan nu connecten enzo.

thx!
Je zou ook kunnen kijken naar de AutoFlush optie. Zit op de meeste stream classes wel. Weet niet of jij een eigen writer gebruikt?

Omdat het toch je eerste keer is met Sockets, waarom heb je gekozen voor een stream en niet voor de Socket.Send & Socket.Receive method?

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 15-04 15:52
ik was begonnen met wat voorbeeld code, maar die ga ik altijd ontleden omdat ik anders niet weet wat ik doe, en daar werd van een stream gebruik gemaakt .

Nu ik een connectie heb kan ik me op mijn gemak gaan bezig houden met het hoe en wat....

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
_Thanatos_ schreef op vrijdag 21 januari 2005 @ 13:04:
[...]
Alleen de low-ASCII karakters. high-ASCII (dus 128 en hoger) worden in utf-8 wel encoded. Dus als je alsnog de letterlijke ASCII-representatie wil gebruiken, moet je Encoding.ASCII gebruiken.
hi-ascii bestaat niet. ASCII is een Amerikaanse standaard (X3.4 om precies te zijn, uit 1963) en definieert maar 128 karakters, 33 control en 95 printable.

Het aantal mensen wat ontdekt heeft dat je op een 8-bits systeem extra karakters kunt definieren is ontelbaar; het aantal uitbreidingen ook. Microsoft heeft er ook dozijnen (code pages). Die heten dan bijvoorbeeld cp-1252. Gangbaarder zijn de extensies als ISO8859-1 = Latin-1; zoals de naam ISO aangeeft zijn dat International Standards ipv bedrijfseigen extensies.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1