Page 1 sur 1

[R] Ecrire en binaire dans un fichier

Posté : mar. 13 déc. 2011 21:34
par TT22
Bonjour,
Voilà, cela fait quelques jours que je cherche comment faire, et je ne trouve toujours pas :
Je voudrais écrire en binaire dans un fichier.
Mais, pas en envoyant des caractères comme "0x5374657665204A6F62730D0A313935352D32303131", je voudrais envoyer du vrai binaire dans le fichier comme "0110111011011100000100000010"

L’intérêt, c'est que j'essaye de créer des fichiers avec un langage binaire que j'aurais créé.

Voilà, merci d'avance pour votre aide.

Re: [..] Ecrire en binaire dans un fichier

Posté : mar. 13 déc. 2011 21:51
par Tlem
Il faut utiliser une fonction de conversion.
En cherchant un peu sur le forum (recherche rapide) vous trouverez votre bonheur.

Re: [..] Ecrire en binaire dans un fichier

Posté : mar. 13 déc. 2011 21:58
par TT22
Si il s'agit de la fonction StringToBinary, ce n'est pas ce qu'il me faut (ou alors je l'ai mal utilisé).

Edit : Parceque je n'ai pas besoin d'envoyer le binaire de "0101" par exemple qui donnerait ceci "0x30313031", j'ai besoins d'envoyer "0101".
Donc, si j'envoie 8 chiffres "01010101" (8bits) mon fichier fera 1 octet. Or, si j'utilise StringToBinary, mon fichier fera 8 octets.

Re: [..] Ecrire en binaire dans un fichier

Posté : mar. 13 déc. 2011 22:00
par sylvanie
il faut parcourir la chaîne par paquet de 8 caractères (vos pseudo bits) pour reconstituer des vrais octets et après on revient à du binaire.
J'ai ressorti des cartons un vieux convertisseur que j'avais fait il y a 5 ou 6 ans que j'ai réadapté :

Code : Tout sélectionner

$stringbit="0110111011011100000100000010"

$convertion=convert_bitstring_to_binary($stringbit)
if Not @error Then
    ConsoleWrite($convertion&@CRLF)
Else
    ConsoleWrite("La donnée n'a pas une longueure multiple de 8 bits"&@CRLF)
EndIf


Func convert_bitstring_to_binary($string)
    Local $size=StringLen($string)
    Local $substring
    Local $ind
    Local $str_ret=""
    If Not Mod($size,8) Then
        SetError(1)
        Return -1
    EndIf
    For $ind=1 To $size step 8
        $str_ret&=Hex(_BinToDec(StringMid($string,$ind,8)),2)
    Next
    SetError(0)
    Return Binary("0x"&$str_ret)

EndFunc

Func _BinToDec($i_Bin)
    Local $i_End = StringLen($i_Bin)
    Local $i_DecOut = 0
    Local $i_Count
    For $i_Count = 1 To $i_End
        Select
            Case StringMid($i_Bin, $i_End + 1 - $i_Count, 1) = "1"
                $i_DecOut = BitXOR($i_DecOut, BitShift(1, - ($i_Count - 1)))
        EndSelect
    Next
    Return $i_DecOut
EndFunc   ;==>_BinToDec
 

Re: [..] Ecrire en binaire dans un fichier

Posté : mar. 13 déc. 2011 22:05
par TT22
Merci, mais j'ai deux petits problèmes :
1. Je n'arrive pas à écrire le résultat dans un fichier (l’écrire en binaire, lui il m'écrit les caractères :? )
2. Et si j'utilise des paquet de 7 caractères ?

Re: [..] Ecrire en binaire dans un fichier

Posté : mar. 13 déc. 2011 22:14
par sylvanie
1- je pense que vous n'avez pas ouvert le fichier en mode 18 (écriture binaire)
voir exple remodifié :
► Afficher le texte
2- la donnée de base c'est l'octet = 8 bits donc après à vous de padder avec ce qui vous chante.( les bits 0 semble un choix pertinent)

Re: [..] Ecrire en binaire dans un fichier

Posté : mar. 13 déc. 2011 22:34
par Iste
TT22 a écrit :1. Je n'arrive pas à écrire le résultat dans un fichier (l’écrire en binaire, lui il m'écrit les caractères :? )
2. Et si j'utilise des paquet de 7 caractères ?
1. si vous l'ouvrez avec un éditeur de texte, c'est normal, ce dernière va récupérer les bit 8 par 8 et essayer de comprendre en quoi est encodé votre texte.
Il va "trouver" et afficher le résultat.

Pour la découpe, en AutoIt on vous propose d’écrire des chaines. Chaine faites de char de 8bit. Il faut donc ruser en utilisant une fonction comme celle de sylvanie pour transformer votre suite de 1 et de 0 en chaine de caractère équivalente.

Et vous devrez bien compléter le dernière octet car un octet c'est 8 bit, on a pas le choix.

N'oubliez pas non plus que le binaire est presque toujours traduit en hexa pour etre plus lisible, qui est lui meme traduit en texte par la plupart des outils permettant son affichage

Re: [..] Ecrire en binaire dans un fichier

Posté : mer. 14 déc. 2011 08:46
par mikell
Iste a écrit : un octet c'est 8 bit, on a pas le choix.
Un octet-bang obligatoire, quoi
:arrow:

Re: [..] Ecrire en binaire dans un fichier

Posté : mer. 14 déc. 2011 11:06
par TT22
Ok, merci.
Juste une dernière question : comment on fait pour passer de l'écriture hexadécimale à l'écriture binaire ?

Re: [..] Ecrire en binaire dans un fichier

Posté : mer. 14 déc. 2011 11:19
par sylvanie
Et bien lorsqu'une variable est de type "bynary" (0x5360 par exple) est que le fichier ouvert en écriture est en mode 18 (binary open + write), le fichier obtenu est en binaire, avec 2 octets à savoir 0x53 et 0x60.
Si vous reprenez mon dernier exemple et que vous éditez le fichier sortie en hexa (pspad, Notepad++,.. mais pas Scite) alors vous verrez les octets.

Re: [..] Ecrire en binaire dans un fichier

Posté : mer. 14 déc. 2011 11:29
par TT22
Oui, mais comment on fait pour passer d'une écriture hexadécimale à une écriture binaire avec AutoIt ?

Re: [..] Ecrire en binaire dans un fichier

Posté : mer. 14 déc. 2011 11:35
par Iste
Ce que j'ai essayé de vous expliqué c'est que justement, on écrit pas en binaire. Le mieux que l'ont puisse faire, c'est écrire des octets. A vous de les remplir correctement.

Re: [..] Ecrire en binaire dans un fichier

Posté : mer. 14 déc. 2011 11:41
par TT22
D'accord, mais avec le script de sylvanie, dans le fichier créé il y a bien les bits demandés.
Après, à partir de ce fichier je le lis en mode binaire avec et il me retourne de l’hexadécimal. Or, dans mon script j'ai besoin de traiter du binaire en mode binaire, pas en mode hexadécimal.
Donc, comment peut-on traduire de l'hexadécimal en bits ?

Re: [..] Ecrire en binaire dans un fichier

Posté : mer. 14 déc. 2011 11:46
par Iste
char, hexa, int, même les chaines de caractères, tout ca ne sont que des façons de représenter du binaire !!

A vous de convertir l'hexa en bit, si vraiment cela vous est utile.

Vous trouverez bon nombre d'exemple de conversion sur le net, pour vous lancer, sachez que un caractère hexa allant de 0 a F représente 4bit allant de 0000 a 1111

Re: [..] Ecrire en binaire dans un fichier

Posté : mer. 14 déc. 2011 11:56
par sylvanie
[Attention, il y a eu des posts en plus depuis cette rédaction, je repars du poste d4iste concernant le fait qu'on ne peut pas écrire en binaire, du coups il y a peut être du redit]

Cette assertion n'est pas tout à fait vraie au sens où on écrit bien en binaire, mais nous sommes sur des systèmes pour lesquelles l'unité insécable est l'octet.
Maintenant, sur PC, je rejoint parfaite Iste sur le fait qu'on ne peut écrire "bit par bit", on est assujetti à cette unité de base qu'est l'octet.

Pour la dernière question de TT22, je pense qu'il voulait plutôt demander :
comment fait on pour passer d'une string contenant de l'hexa, genre "0x33" à la véritable valeur binaire 0x33.
Si c'est ça, il s'agit de la fonction binary
Je vais la refaire en exemple encore plus détaillé :
$text="0x33", c'est une chaîne de caractères composée de 4 caractères 0,X,3,3
Binary($text) va renvoyer la valeur 0x33 qui constitue un octet de décomposition binaire 110011
Pour aller encore plus loin pour ceux qui ne sont pas familier avec ces concertions, 0x33 (base 16) représenté en base 10, ça fait 3*16^1+3*16^0 = 51
Pour convertir 51 (base 10) en base 2, ça fait 1*2^5 +1*2^4+0*2^3+0*2^2+1*2^1+1*2^0 cad 110011 et en octet ça fait par 00110011

Voilà quitte à avoir défoncé des portes ouvertes (ou pas) j'espère avoir contribué à une meilleur que la compréhension

Re: [..] Ecrire en binaire dans un fichier

Posté : mer. 14 déc. 2011 12:24
par TT22
J'ai fait cette petite fonction pour passer du hexa au bit, est-ce que c'est bon ?
► Afficher le texte
Edit : Après quelques test, ça fonctionne.
Je passe en [R] :D

Re: [R] Ecrire en binaire dans un fichier

Posté : mer. 14 déc. 2011 17:46
par Tlem
Mouais, il y en a qui aime bien refaire les choses. :lol:
http://www.autoitscript.fr/forum/viewto ... f=6&t=8342

Re: [R] Ecrire en binaire dans un fichier

Posté : mer. 14 déc. 2011 17:54
par TT22
:lol: Effectivement, je n'avais pas vu.
Mais bon, ça me fait un petit entrainement ce qui ne peut que être positif :P

Re: [R] Ecrire en binaire dans un fichier

Posté : mer. 14 déc. 2011 19:15
par sylvanie
mouais aussi, car la 2eme solution donnée en lien et comment dire...,
j'adore le concept du plantage de carottes à base de TNT, buldozzer + camion avec creusement de carrière à ciel ouvert ...


on va reprendre les bases : pour savoir si une valeur se termine par "1" dans sa représentation binaire :
BitAnd($val,1)
puis on fait un bitshit de 1 pour dégager le bit traîté, du coups le bit suivant passe en dernière position à son tour et on recommence jusqu'à ce que la valeur étudiée soit nulle
coût moyen par octet : 8 boucles en moyenne avec un et bit à bit et un décalage.
Le seul appel à une fonction de type stringxxx est unt stringright pour les astuces de padding
► Afficher le texte
Mais comme le souligne TT22, l'avantage de vouloir refaire les choses, c'est que ça fait de l'exercice