Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/06/2013, à 11:11

obibann

[RESOLU] Créer un fichier binaire

Bonjour,

Je souhaiterai créer un fichier contenant des suites de valeurs au format binaire.
Pour le moment, je le créé au format ascii, mais souhaiterai le convertir en binaire.

Le fichier contient une suite de valeurs typées :

integer (4 octets), bigint (8 octets), string (100 caractères)

Exemple ascii :

0000000002 00000000000000000452 bonjour

Comme puis-je réaliser ceci pour obtenir un fichier binaire ?

Merci

Edit : langages à dispo : bash ou perl ou toutes commande linux courante

Dernière modification par obibann (Le 21/06/2013, à 15:02)


Ubuntu 16.04
Avec Windows, on fait ce qu'on peut... Avec Linux, on fait ce qu'on veut !! :p

Hors ligne

#2 Le 19/06/2013, à 11:27

Braun

Re : [RESOLU] Créer un fichier binaire

Bonjour,
Créer un fichier pour créer un fichier, je ne vois pas trop l'intérêt.
A priori, pour des questions de lisibilité on préconise souvent le codage ascii pour les nombres, voir part exemple les appareils HP-IB ou IEEE 488.
Cependant et notamment si tu utilises du C, il est possible de recopier du binaire ... par exemple en faisant le dump d'une zone mémoire.

Hors ligne

#3 Le 19/06/2013, à 11:30

obibann

Re : [RESOLU] Créer un fichier binaire

Je ne souhaite pas créer un fichier pour créer un fichier.

Actuellement, nous avons un système de chargement de données en base (Sybase) au format ASCII et souhaiterions réaliser ce chargement en binaire (gains de performance). C'est pourquoi je cherche une méthode pour écrire mon fichier en binaire.

Merci


Ubuntu 16.04
Avec Windows, on fait ce qu'on peut... Avec Linux, on fait ce qu'on veut !! :p

Hors ligne

#4 Le 19/06/2013, à 11:33

pingouinux

Re : [RESOLU] Créer un fichier binaire

Bonjour,
À ta place, je ferais ça en C (voir la fonction fwrite).

Ajouté :
Ou en python (voir struct.pack)

Dernière modification par pingouinux (Le 19/06/2013, à 11:57)

Hors ligne

#5 Le 19/06/2013, à 11:41

Nasman

Re : [RESOLU] Créer un fichier binaire

Ta question n'est pas claire. Si tu as au départ des valeurs ascii, ces dernières peuvent aisément être converties en binaire cependant tu peux avoir différents cas :
valeur ascii 65 (soit le caractère A), soit 41h en hexa, soit 01000101 en binaire
si ce A est en fait déjà la valeur hexa Ah, alors ce sera 000010100 en binaire

De même un "7" aura pour valeur ascii 55, soit 37h en hexa, soit 00110111 en binaire mais si c'est la valeur numérique que tu veux coder (et non pas la caractère ascii) alors 7h sera codé 00000111 en binaire.


PC fixe sous Bionic 64 bits et portable avec Focal 64 bits

Hors ligne

#6 Le 19/06/2013, à 13:29

serged

Re : [RESOLU] Créer un fichier binaire

Peut-être un tour sur :

man xxd

qui donne:

xxd -r fichierhexa fichierbin

LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)

Hors ligne

#7 Le 19/06/2013, à 14:09

obibann

Re : [RESOLU] Créer un fichier binaire

Donc il faudrait que je commence par générer un fichier hexa, puis que je le convertisse en binaire ?

Voici la documentation fournie par Sybase sur le format binaire : http://infocenter.sybase.com/help/index … CHFDAB.htm

Mais je rame ...

Voici la liste exhaustive des formats à manipuler :

unsigned int
smallint
tinyint
unsigned bigint
bigint
varchar

Pas de flottant, c'est déjà ça ...

Dernière modification par obibann (Le 19/06/2013, à 14:17)


Ubuntu 16.04
Avec Windows, on fait ce qu'on peut... Avec Linux, on fait ce qu'on veut !! :p

Hors ligne

#8 Le 19/06/2013, à 15:09

Braun

Re : [RESOLU] Créer un fichier binaire

obibann a écrit :

Donc il faudrait que je commence par générer un fichier hexa, puis que je le convertisse en binaire ?

Pour gagner du temps?  Cela me semble une aberration, les logiciels de conversion "binhex" le font pour des raisons de sécurité au prix d'un temps et d'un volume plus élevés.
Si j'ai bien compris tu disposes d'une structure contenant des champs de type différent et tu recopies ces champs globalement sans te préoccuper des petits bits qu'ils contiennent mais seulement de leur taille.

Hors ligne

#9 Le 19/06/2013, à 16:14

obibann

Re : [RESOLU] Créer un fichier binaire

C'est ça, en gros, pour un entier, j'ai essayé ceci (en perl) :

pack("B32",sprintf("%b",$value));

Mais la lecture du fichier généré avec xxd semble me faire dire que ça ne fonctionne pas...

Exemple shell qui fonctionne :

echo -n -e "\x01\x00\x00\x00\x00\x00\x00\x00" >> tmp.bin

Sur ce dernier exemple on a bien la valeur binaire "1" dans le fichier.


Ubuntu 16.04
Avec Windows, on fait ce qu'on peut... Avec Linux, on fait ce qu'on veut !! :p

Hors ligne

#10 Le 19/06/2013, à 17:30

obibann

Re : [RESOLU] Créer un fichier binaire

Je pense avoir trouvé (perl) :

sub uIntegerToBin {
  return pack("L",$_[0]);
}

sub uBigintToBin {
  return pack("Q",$_[0]);
}

sub bigintToBin {
  return pack("q",$_[0]);
}

sub smallintToBin {
  return pack("S",$_[0]);
}

sub tinyintToBin {
  return pack("B8",sprintf("%b",$_[0]));
}

sub varcharToBin 
{
  my $stringLength = length($_[0]);
  my $stringBitSize = $stringLength * 8;
  my $binstring = "";
  @string = split //, $_[0];
  foreach my $char (@string) {
    $binstring .= sprintf("%08b",ord($char));
  }
  return pack("B$stringBitSize",$binstring);
}

$randomval = 10;
open (MYFILE, '>:raw', 'test.bin');
print MYFILE varcharToBin($randomval);
print MYFILE uIntegerToBin($randomval);
print MYFILE smallintToBin($randomval);
print MYFILE tinyintToBin($randomval);
print MYFILE uBigintToBin($randomval);
print MYFILE bigintToBin($randomval);
close (MYFILE); 

le fichier final semble bien contenir la valeur 10 dans les formats souhaités

Dernière modification par obibann (Le 19/06/2013, à 17:31)


Ubuntu 16.04
Avec Windows, on fait ce qu'on peut... Avec Linux, on fait ce qu'on veut !! :p

Hors ligne

#11 Le 20/06/2013, à 03:59

nesthib

Re : [RESOLU] Créer un fichier binaire

#!/usr/bin/python
with open('/tmp/fichier_binaire', 'w') as f:
    f.write(bytearray('Pourquoi faire simple quand on peut faire compliqué ?', 'utf-8'))
$ hd /tmp/fichier_binaire
00000000  50 6f 75 72 71 75 6f 69  20 66 61 69 72 65 20 73  |Pourquoi faire s|
00000010  69 6d 70 6c 65 20 71 75  61 6e 64 20 6f 6e 20 70  |imple quand on p|
00000020  65 75 74 20 66 61 69 72  65 20 63 6f 6d 70 6c 69  |eut faire compli|
00000030  71 75 c3 a9 e2 80 af 3f                           |qu.....?|
00000038

tongue

NB. pour du texte, comme ici, tu ne verras pas sur ta machine de différence entre un fichier binaire pour lequel tu as encodé les caractères en utf-8 et un fichier texte. Bien entendu tu peux envoyer n'importe quoi comme type de données :

Pour faire des conversions automatiques tu peux utiliser le module struct.
ex. sauvegarder 42 en tant qu'int

#!/usr/bin/python
import struct
with open('/tmp/fichier_binaire', 'w') as f:
    f.write(struct.pack('i', 42))

Lis la doc de struct, tu peux choisir plein de paramètres comme la longueur de tes entiers, l'endianness…


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#12 Le 20/06/2013, à 10:51

Braun

Re : [RESOLU] Créer un fichier binaire

Woah,
Moi qui ne connaissais guère que le jusqu'au-boutiste je découvre le "gros-boutiste", le "petit-boutiste" et même le "byte sex".
Je me sens moins bête smile

Hors ligne

#13 Le 20/06/2013, à 15:56

obibann

Re : [RESOLU] Créer un fichier binaire

Merci smile

Je suis resté en perl pour des raisons pratique, y'a la même fonction qui existe "pack".
Par exemple, pour in int :

pack("L",42);

J'arrive à générer un fichier binaire valide qui s'intègre en base à la vitesse de l'éclair smile

Merci wink


Ubuntu 16.04
Avec Windows, on fait ce qu'on peut... Avec Linux, on fait ce qu'on veut !! :p

Hors ligne