Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Richard Clark

J'aime pas les blogs mais comme j'aime le mouton...

Actualités

  • c2i.fr
Ou est l'erreur ? (Update)

Suite à un problème de communication évident entre la Lithuanie et le Pays Basque (aka Aras, développeur du moteur 3D de Project Hoshimi et moi-même), j'ai été obligé de réécrire l'écriture de string dans un flux binaire.

En effet, entre le game Engine et l'un des viewers, la communication s'effectue via TCP et le port 900. Je me refais une communication à la Direct Play en utilisant directement les sockets. Cela permet une très grosse optimisation et permet de jouer via Internet même avec une communication digne de celle de Laurent Kempé, c'est-à-dire à chier!

[Update]Pour ceux qui n'auraient pas compris (pffffff), je faisais allusion ici à la connexion Internet de Laurent chez lui qui est à 512K, bref, une connexion de merde.[/Update]

Donc, j'ai du écrire les ligne suivantes :

public static void WriteString(BinaryWriter writer, string s)
{
int iLength = (new System.Text.UTF8Encoding(false, true)).GetByteCount(s);
writer.Write((UInt16)iLength);
writer.Write(s.ToCharArray(), 0, iLength);
}

Maintenant, dites-moi ou est l'erreur ? ;-))))

Erreur que je ne corrigerais pas d'ailleurs. Les architectes en herbes vont hurler, mais pour une fois, l'UI dictera mon code.

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: mardi 26 septembre 2006 08:16 par richardc

Commentaires

Erebuss a dit :

Uint16 qui n'est pas CLS Compliant ;)
Je prends le MSN à un ami, Jean-Pierre ^^
# septembre 26, 2006 08:43

richardc a dit :

Si tu pouvais savoir comme je m'en tape du non CLS Compliant pour discuter avec une appli C++ native. De plus, le UInt16 permet de gagner quelques bits de bande passante ;-)
# septembre 26, 2006 08:59

Erebuss a dit :

Je sais bien :) C'était pour me laisser le temps de prendre mon café.

Pour les quelques bits en plus, je me doute que c'est pour LK ;-)

Bon je laisse les architectes en herbe trouver, moi je retourne à mon dev lol En tout cas, ya moyen d'avoir de belles erreurs avec ton code ^^
# septembre 26, 2006 09:05

Anonymous Idiot a dit :

Disclaimer: Ca fait un moment que je n'ai pas utilisé .NET ou Mono.

A la 2ème ligne, le cast vers un UInt16 sans vérifier que iLength est < 0xFFFF.
A la 3ème ligne, on passe iLength à BinaryWriter.Write(char[], int, int) au lieu de s.Length.
# septembre 26, 2006 09:19

Miiitch a dit :

un caractere en UTF8 compte pour 1 octet ou plus. Donc iLength n'est pas liés aux nombres de caractere du tableau s.ToCharArray() comme le suppose l'appel le 2eme appel a write

De plus, la ou ca doit peut etre pas marcher c'est au niveau de l'appel de writer.Write(s.ToCharArray(), 0, iLength): Les caracteres sont encodé en fonction de l'encodage choisit à l'appel du constructeur du writer. Il vaut mieux qu'il soit le meme!

Donc j'ecrirais plutot:
writer.write(s.Lenght())
writer.write(s.ToCharArray())

et je ferais ensuite un
count = reader.ReadInt16
et un reader.readChars(count);

Le reader et le writer  ayant le meme encoding. D'ailleur ReadString et write(string) devraient etre suffisant dans ce cas la
# septembre 26, 2006 10:14

richardc a dit :

Absolument, mais le problème que j'ai avec mon Lithuanien préféré est qu'il n'a rien de prévu pour ca! Moralité, je garde le même code mais j'interdis les caractères "spéciaux", "accentués".
# septembre 26, 2006 10:21

Anonymous Idiot a dit :

Une autre solution serait de forcer un encoding UTF-8 et de le passer en tant que bytestream.

public static void WriteString( BinaryWriter writer, string str )
{
 int length;
 UTF8Encoding utf8;
 byte[] buffer;

 utf8 = new UTF8Encoding( false, true );
 length = utf8.GetByteCount( str );
 buffer = new byte[length];
 utf8.GetBytes( str, 0, str.Length, buffer, 0 );
 writer.Write( (ushort) length );
 writer.Write( buffer, 0, length );
}
# septembre 26, 2006 10:35

Anonymous Idiot a dit :

D'ailleurs il me semble que le code original ne fonctionnera pas quand le BinaryWriter n'est pas set en UTF-8.
Le code original envoie le nombre de bytes utilisé par la string UTF-8 (= nombre de cara + 0-3 byte par cara) comme header, mais ce nombre de bytes envoyé par Write(s.ToCharArray()...) sera différent pour tout autre encoding.
De plus il me semble que l'encoding par défaut du BW est UTF-16, pour lequel le nombre de bytes envoyé sera presque toujours différent de la string équivalente UTF-8. Ne parlons pas de l'UTF-7 (toujours différent) ou de l'UTF-32 (toujours différent si il y a des cara ASCII).

"je garde le même code mais j'interdis les caractères "spéciaux", "accentués"."

Si s contient uniquement des caractères ASCII, et que le BW n'est pas set en mode UTF-8, alors iLength sera toujours différente du nombre de bytes envoyés par Write(char[], int, int).

Si le code que tu as posté fonctionne, c'est un peu par l'opération du saint-esprit je pense...

(Corrigez moi si je me trompe)
# septembre 26, 2006 11:00
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [Silverlight] En attendant Silverlight 2 RTW par Blog Technique d'Audrey PETIT le il y a 22 heures et 51 minutes

- Le nouveau Gojira, c’est pour lundi… par CoqBlog le 10-11-2008, 01:18

- SharePoint : nouvel article sur la mise en place des Scopes dans MOSS Searchs par Blog Technique de Romelard Fabrice le 10-10-2008, 17:52

- Hello CS par Le Blog de julz le 10-10-2008, 12:26

- MSDN/TechNet/Microsoft Days Tour 2008 à Lille les 13 et 14 Octobre ! par RedoBlog - The .NET Gentleman !!! le 10-10-2008, 09:35

- MVC Pratique #07 - Un projet concret et le transfert des objets avec les ModelBinders par #Rui le 10-09-2008, 23:39

- SQL Server 2008 : Certifié - TS Admin (70-432) par SQL Server vu par Christian Robert le 10-09-2008, 10:58

- [WPF] Comment changer la couleur utilisée pour sélectionner les éléments d’un ItemsControl ? par Thomas Lebrun le 10-09-2008, 10:49

- Hello World! par Hamid's Place le 10-08-2008, 23:38

- SQL Profiler - Configuration pour un développeur - tracer les requêtes SQL de votre application par Atteint de JavaScriptite Aiguë [Cyril Durand] le 10-08-2008, 15:52