Chaine binaire ou non

Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 - 3 sept. 2003 à 19:29
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 - 3 sept. 2003 à 23:09
Voila mon problème : je recoit en temps normal par socket une chaine que j'afiche ds un edit, seulement, j'ai crée un systeme d'envoi de fichier qui peut également envoyé des chaine binaire que j'inscrit ds un fichier...

Ma question est : comment je peut reconnaitre si la chaine est binaire ou non afin de pouvoir la traité comme il le faut ? J'ai essayé plusieur méthode mais sans succès...

21 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 sept. 2003 à 19:37
Disons que si tu as un octet < 9 tu consideres comme binaire, c'est une idee.
BruNews, ciao...
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
3 sept. 2003 à 19:45
en testant avec if(buf[0]<9) par exemple, il le considere comme une chaine normale et l'affiche (d'ailleur il affiche n'importe quoi, et pas des 0 ou 1 contrairement a ce que je pensai...)
merci quand même
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
3 sept. 2003 à 20:10
Salut,
Il faut tester tout les octets du buffer que tu as recu et si l'un d'entre eux est < 9 alors tu peux considerer ce que tu as recu comme du binaire. Aussi, il faut penser a envoyer les chaines de caracteres sans les caracteres NULL de la fin.
Ca devrait fonctionner je pense.
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
3 sept. 2003 à 20:13
ok merci je vais essayé
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
3 sept. 2003 à 20:21
Bon ben soi ca ne marche pas, soi je m'y prend mal... en tt cas, g rien de bien convaincan...

Mais c'est pas très grav, j'ai pensé a une autre solution, je vais écrir "char" avant tte les chaines normales comme ca je pourrai facilement les reconnaitre, il me suffira juste de l'enlevé après pour l'afficher
@+
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
3 sept. 2003 à 20:37
Salut,
Si j'etais toi je mettrais un flag a la fin de la chaine aussi.
Imagine que ton client envoie 2 paquets, l'un est une chaine, l'autre est binaire: il est tout a fait possible que ton serveur recoive les 40 octets d'un coup dans un buffer, et interprete tout le buffer comme une chaine de caractere.
Moi je pense que tester la valeur de chaque octet est une meilleure idée, et en plus ca l'alourdira pas tes buffers.
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
3 sept. 2003 à 20:47
Je pense aussi que tu as raison, surtout que je vien de testé ma technique, elle n'as pas l'air de fonctionner comme je le voulais...
Enfin, comme le teste de la chaine ne marche pas chez moi, j'ai pensé a une autre solution, pour évité tout les risque de conflit, je peut fair passé le transfert par un autre socket, mais pour cela il faut recrée une écoute sur un autre port et je la fleme de faire tt ca... Je crois que je vais resté a mon ancienne version ou on doit attendre que la création du fichier soit terminé pour pouvoir envoyé des message normaux...
Je ne vois pas d'autre technique simple
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 sept. 2003 à 20:59
Dis voir Anacr0x, tu l'as ecrit comment ton teste ?
c'est du char (le type) sur lequel tu testes < 9 ???
En ce cas nenni, faut caster BYTE.
BruNews, ciao...
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
3 sept. 2003 à 21:03
Salut,
Je viens de tester en testant si l'un des octets est <9.
Ca marche tres bien pour differencier du binaire et des chaines de caracteres.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 sept. 2003 à 21:05
bah oui en general, on fait ainsi.
BruNews, ciao...
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
3 sept. 2003 à 21:15
ben moi j'ai testé kom ca :

bool Binaire=false;
for(int i=0; i<1024; i++)
if(buf[i]<9) Binaire=true;
if(Binaire==true)
ecriture...
else
affichage...

résultat, il m'écrit meme les chaine normal dans le fichier, ce ki évidemment le rend corrompu....

BruNews-> Commen faire un cast ici ? je ne voi pas trop...
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
3 sept. 2003 à 21:16
jvien d'y pensé, csans doute a cause du 0 de fin de chaine
faut ke je l'enlev ds le test
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 sept. 2003 à 21:35
mets un BYTE *pbits = (BYTE*) buff;
parcours avec ce pbits toute ta chaine
ainsi le teste < 9 ira bon
BruNews, ciao...
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
3 sept. 2003 à 21:35
Salut,
Faut pas tester tout le buffer, mais seulement ce que tu recois:

int OctetRecu = recv(...);
for(int i=0; i<OctetRecu, i++)
{
...
}
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
3 sept. 2003 à 22:10
J'ai fait plein de test et vs allez ptet dire que je suis pas doué mais voila ou j'en suis :

n = recv(ktmp->sock, buf, sizeof(buf), 0);

BYTE *pbits = (BYTE*) buf;
bool Binaire=false;
for(int i=0; i<n-1; i++)
{
if(*pbits<9) Binaire=true;
pbits++;
}
if(Binaire==true)
ecriture...
else
lecture...

J'ai deux problème, le premier, la chaine caractère est tt de même écrite dans le fichier... le deuxieme, certains fichier ne supporte pas ce traitement, par exemple, en essayant d'échanger un fichier winrar auto-extratible, ca maffiche du text (compréhensibl cette fois) contenu dans le fichier, et encore une fois, le fichier est altéré

Pour le 1er pb, je crois que c'est parcequ'il colle les packet recu ensemble (donc une chaine normale sera considéré comme binaire s'il yen a avant ou a la suite)

Pour le second, si c'est normale, je préfère ne pas utilisé ce test et être sur que tout les fichiers transmi sont bien valides
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
3 sept. 2003 à 22:22
Salut,
C'est bon ca.
Le prob vient surement du moment ou tu envoies tes données binaires.
Tu aurais pas envoyé un Buffer de d'une taille egale a strlen(Buffer) par hazard ?
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
3 sept. 2003 à 22:26
Pour les chaine de caractère normales oui, ya un strlen, sinon, pour l'envoi de fichier, c'est des paquets de 1024 octet tt le tps
Tu crois ke le fait de mettre des paquet de 1024 meme pour les message normaux changera quelques chose ? jsui pas trè convaincu la...
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
3 sept. 2003 à 22:29
Salut,
Nonon pour chaine strlen est parfait. Je verifiais juste que tu avait pas fait la meme erreur que la derniere fois :P
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
3 sept. 2003 à 22:36
Ah oki, nan quand meme, j'ai retenu la lecon, j'évite de faire plusieur fois la même erreur (^_^)

Bon sinon, je vous remercie beaucoup de m'avoir aidez, je crois ke je vais pas utilisé cette technique (je pense qu'elle marche pour une chaine simple, mais mon cas a l'air plus compliqué) mais plutot une otr socket ou alor je me démerderé d'une manière ou d'une autre...
Merci encore à tout les deux, @+
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
3 sept. 2003 à 23:07
Salut,
Ecoute moi j'ai testé cela marche très bien.
Si tu veux je t'envoies mes progs de test pour que tu voies les differences avec les tiens.
0
Rejoignez-nous