begin process at 2008 07 20 15:57:08
1 213 292 membres
207 nouveaux aujourd'hui
14 166 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Probleme de conversion de byte pour lecture par un serveur [ Algorithme / Maths ] (Liverion)

Probleme de conversion de byte pour lecture par un serveur le 25/04/2008 11:28:22

Liverion
Bonjour,
je voudrais ameliorer un programme que j'ai concu, qui fonctionne mais qui est un peu lourd :
Je dois envoyer a un serveur des donnees pour une simulation, mes donnees sont stockées dans un byte[140] et le serveur veut recuperer une String
Je commence donc par recuperer tout les bytes dans une chaine :
privatestring[] getByteStringFromByteArray(byte[] value)
{
// Conversion of the byte array to a string String infos = BitConverter.ToString(value);

// put the "infos" string into the "toNadasData" array toNadasData.Add(infos);

// a char array to use the "-" caracter as a separatorchar[] tiret = newchar[1];
tiret[0] = '-';
return infos.Split(tiret);
}
( la ligne  "toNadasData.Add(infos);" sert uniquement a garder en memoire les chaines contenant les bytes )

Ensuite mon souci vient du fait que mon serveur prend en fait chaque caractère de la chaine pour recuperer les informations utiles a la simulation, mais que lui ne doit pas etre ecrit en C#, puisque pour le faire fonctionner il faut que je transforme 2 bytes en un caractère Unicode (par exemple si j'ai ma chaine de byte qui fait "0A 15 2C 6D ..." je dois transmettre "\u150A \u6D2C ..."

Je gere actuellement cela avec ces deux fonctions :
_ Celle ci dans ma classe principale :
privatestring prepareStringForSending(string[] value)
{
String sentString = "";
for (int i = 0; i < value.Length; i += 2)
// changing 2 bytes written into string in a UTF-16 character for sending it to the server sentString += dataFromFile.getUnicodeFromString(value[i + 1], value[i]);
// "End of string" character sentString += "\u0009";
return sentString;
}

_ Qui appelle celle ci :

publicstring getUnicodeFromString(stringvalue1, stringvalue2)
{
string var = "";
switch (value1)
{
case "00": switch (value2)
{
case "00": var = "u0000"; break;
case "01": var = "\u0001"; break;
case "02": var = "\u0002"; break;
case "03": var = "\u0003"; break;
case "04": var = "\u0004"; break;
case "05": var = "\u0005"; break;
case "06": var = "\u0006"; break;
...
case "FA": var = "\uFFFA"; break;
case "FB": var = "\uFFFB"; break;
case "FC": var = "\uFFFC"; break;
case "FD": var = "\uFFFD"; break;
case "FE": var = "\uFFFE"; break;
case "FF": var = "\uFFFF"; break;
};

break;

default: var = "\u0000"; break;

}

return var;

}


Comme vous vous en doutez, un switch sur 2 bytes ca pese lourd, donc si quelqu'un avait une idée pour faire ca d'une autre manière, cela m'interesserait.

Merci d'avance


Re : Probleme de conversion de byte pour lecture par un serveur le 25/04/2008 12:29:01

Liverion
Désolé pour la mocheté du code, je l'avais pourtant passé au coloriseur, je le remet donc :

private string[] getByteStringFromByteArray(byte[] value)
{
// Conversion of the byte array to a string
 String infos = BitConverter.ToString(value);
// put the "infos" string into the "toNadasData" array
toNadasData.Add(infos);
// a char array to use the "-" caracter as a separator
char[] tiret = new char[1];

tiret[0] = '-';
returninfos.Split(tiret);
}



private string prepareStringForSending(string[] value)
{
String sentString = "";
for
(int i = 0; i < value.Length; i += 2)
// changing 2 bytes written into string in a UTF-16 character for sending it to the server
sentString += dataFromFile.getUnicodeFromString(value[i + 1], value[i]);
// "End of string" character
sentString += "\u0009";
returnsentString;
}


public stringgetUnicodeFromString(string value1, stringvalue2)
{
string var = "";
switch(value1)
{
case"00": switch (value2)
{
case"00": var = "\u0000"; break;
case"01": var = "\u0001"; break;
case"02": var = "\u0002"; break;
case"03": var = "\u0003"; break;
case"04": var = "\u0004"; break;
case"05": var = "\u0005"; break;
case"06": var = "\u0006"; break;
...
case"FA": var = "\uFFFA"; break;
case"FB": var = "\uFFFB"; break;
case"FC": var = "\uFFFC"; break;
case"FD": var = "\uFFFD"; break;
case"FE": var = "\uFFFE"; break;
case"FF": var = "\uFFFF"; break;
};
break;
default: var = "\u0000"; break;
}
returnvar;
}

Voila c'est mieux ^^




Re : Probleme de conversion de byte pour lecture par un serveur le 26/04/2008 19:15:21

coq
(Admin CS)
Salut,

Je ne suis pas certains d'avoir compris le sens, mais tu es sûr que les classes de gestion d'encoding ne te permettent pas de faire ce que tu veux ?
[ Lien ]


/*
coq
MVP Visual C#
CoqBlog
*/

Re : Probleme de conversion de byte pour lecture par un serveur le 27/04/2008 01:45:52

Liverion
En fait actuellement le seul souci que j'ai c'est que je recupere soit 2 bytes soit 4 caractères dans un chaine ( A3 BC ou alors "A3-BC" ) et que je dois parvenir a les transformer en : "\uBCA3"

mon tableau de byte contenant 140 bytes, je dois obtenir une chaine qui contient 70 caractères + le caractère fin de ligne
au depart j'avais essayé d'ecrire quelque chose comme :
String sentString = "\u"+infos[1]+infos[0] ...  mais il n'appreciait pas le \u, il me disait qu'il ne connaissait pas cette sequence, pas comme \n par exemple.

Re : Probleme de conversion de byte pour lecture par un serveur le 27/04/2008 11:30:10

coq
(Admin CS)
Réponse acceptée !

\u est la pour mettre un caractère unicode en littéral dans le code, pas au runtime, et dois forcément comporter le codepoint sur 4 digits derrière.

Enfin, si j'ai bien compris la problématique et le but final, ça donnerais ce genre de choses

private static String BytesStringToString(String bytesString)
{
    // TODO : gestion des erreurs : référence nulle, longueur != 5, format invalide, etc etc

    Byte[] bytes = new Byte[2]; // Tableau destiné à recevoir les 2 bytes
    String returnString = null; // Chaine de retour

    // Préparation des paramètres de parse
    NumberStyles style = NumberStyles.HexNumber;
    CultureInfo culture = CultureInfo.InvariantCulture;

    // Split de la chaine d'entrée pour en extraire les 2 "bytes"
    String[] bytesElements = bytesString.Split('-');

    // Tentative de parse
    if (Byte.TryParse(bytesElements[1], style, culture, out bytes[0])
        && Byte.TryParse(bytesElements[0], style, culture, out bytes[1]))
    {
        // Si réussie, nous retournons la chaine
        returnString = Encoding.Unicode.GetString(bytes);
    }
    else
    {
        // Sinon, référence nulle
        returnString = null;
    }

    return returnString;
}


/*
coq
MVP Visual C#
CoqBlog
*/


Re : Probleme de conversion de byte pour lecture par un serveur le 28/04/2008 10:03:04

Liverion
Je vais essayer ca en mettant une iteration après le Split pour traiter mes 140 bytes d'un coup, et je viens donner le resultat ^^
Merci pour le coup de main ;)

Par contre a quoi correspond le CultureInfo ?

Re : Probleme de conversion de byte pour lecture par un serveur le 28/04/2008 11:01:18

Liverion
Je confirme, ca fonctionne, j'ai juste eu à remplacer Encoding.Unicode.GetString(bytes) par Encoding.BigEndianUnicode.GetString(bytes).

Merci beaucoup

Re : Probleme de conversion de byte pour lecture par un serveur le 30/04/2008 23:44:07

coq
(Admin CS)
Je me sert du CultureInfo dans mes appels à Byte.TryParse.
Ca permet de spécifier explicitement la culture à utiliser plutot que de prendre la culture courante.



/*
coq
MVP Visual C#
CoqBlog
*/


Classé sous : string, case, var, break, byte

Participer à cet échange

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS