OVH Cloud OVH Cloud

Lire une valeur numérique sous forme de caractères

8 réponses
Avatar
Pierre Archambault
Bonjour à tous,

Je voudrais savoir comment VB enregistre dans un fichier les valeurs
numériques comme les Integers, Singles, Doubles, Currency etc.

La raison de cette demande est celle-ci:

Je stocke sur disque, des données que j'accède ensuite à l'aide de
l'instruction :

Open "Fichier.dat" for Binary Access Read Shared As #1
Seek #1,1
Get #1, Tampon$

Puis le tampon est découpé en champs (dont je connais la position et la
longueur). Pour les champs String, il n'y a pas de problème mais en ce qui
concerne les champs numériques, la fonction CCur pour convertir en Currency
par exemple ne fonctionne pas car le type est incompatible. Ce que j'ai
besoin de connaître c'est la façon dont ces valeurs numériques sont stockées
sur disque afin que je puisse développer un algorythme qui me permettre de
les lire.

Surtout ne me dites pas d'utiliser des variables "Type défini par
l'utilisateur" pour enregistrer et lire les données; c'est justement ce que
je veux éviter.

Merci de vos lumières.

Pierre

8 réponses

Avatar
Philippe HALET
Bonjour,

A priori, je serais tenter de répondre "type défini par l'utilisateur".
Peux-tu nous éclairer sur la raison qui te pousserait à ne pas utiliser
cette technique? Je ne comprend pas pourquoi tu te compliques la vie alors
que l'utilisation d'une structure est si simple.

Bien à toi,

Philippe

"Pierre Archambault" wrote in message
news:N4Kdh.130713$
Bonjour à tous,

Je voudrais savoir comment VB enregistre dans un fichier les valeurs
numériques comme les Integers, Singles, Doubles, Currency etc.

La raison de cette demande est celle-ci:

Je stocke sur disque, des données que j'accède ensuite à l'aide de
l'instruction :

Open "Fichier.dat" for Binary Access Read Shared As #1
Seek #1,1
Get #1, Tampon$

Puis le tampon est découpé en champs (dont je connais la position et la
longueur). Pour les champs String, il n'y a pas de problème mais en ce qui
concerne les champs numériques, la fonction CCur pour convertir en
Currency par exemple ne fonctionne pas car le type est incompatible. Ce
que j'ai besoin de connaître c'est la façon dont ces valeurs numériques
sont stockées sur disque afin que je puisse développer un algorythme qui
me permettre de les lire.

Surtout ne me dites pas d'utiliser des variables "Type défini par
l'utilisateur" pour enregistrer et lire les données; c'est justement ce
que je veux éviter.

Merci de vos lumières.

Pierre







I choose Polesoft Lockspam to fight spam, and you?
http://www.polesoft.com/refer.html
Avatar
LE TROLL
Bonjour,
Mais pourquoi ne pas enregistrer directement en texte, ce qui a le mérite de
pouvoir mieux contrôler ses erreurs lors de l'écriture du code. Les mettre
en binaire ne les rend illisibles que pour les personnes ne sachant pas les
traduire...

--
Merci beaucoup, au revoir et à bientôt :o)
------
Site de MES LOGICIELS
http://irolog.free.fr
Site éditeur MES ROMANS édités
Le serpent
http://www.manuscritdepot.com/a.joseph-attila-pusztay.1.htm
Le Gaulois
http://manuscritdepot.com/a.joseph-attila-pusztay.2.htm
mon adresse EMail
http://irolog.free.fr/ecrire/index.htm
------------------------------------------------------------------------------------
"Pierre Archambault" a écrit dans le
message de news: N4Kdh.130713$
Bonjour à tous,

Je voudrais savoir comment VB enregistre dans un fichier les valeurs
numériques comme les Integers, Singles, Doubles, Currency etc.

La raison de cette demande est celle-ci:

Je stocke sur disque, des données que j'accède ensuite à l'aide de
l'instruction :

Open "Fichier.dat" for Binary Access Read Shared As #1
Seek #1,1
Get #1, Tampon$

Puis le tampon est découpé en champs (dont je connais la position et la
longueur). Pour les champs String, il n'y a pas de problème mais en ce qui
concerne les champs numériques, la fonction CCur pour convertir en
Currency par exemple ne fonctionne pas car le type est incompatible. Ce
que j'ai besoin de connaître c'est la façon dont ces valeurs numériques
sont stockées sur disque afin que je puisse développer un algorythme qui
me permettre de les lire.

Surtout ne me dites pas d'utiliser des variables "Type défini par
l'utilisateur" pour enregistrer et lire les données; c'est justement ce
que je veux éviter.

Merci de vos lumières.

Pierre





Avatar
jm
"Pierre Archambault" wrote in message
news:N4Kdh.130713$
Bonjour à tous,

Je voudrais savoir comment VB enregistre dans un fichier les valeurs
numériques comme les Integers, Singles, Doubles, Currency etc.

La raison de cette demande est celle-ci:

Je stocke sur disque, des données que j'accède ensuite à l'aide de
l'instruction :

Open "Fichier.dat" for Binary Access Read Shared As #1
Seek #1,1
Get #1, Tampon$




Hello,

C'est quelque chose dont tu ne dois pas avoir
à te soucier, puisque si tu écris en binaire,
alors tu sais ce que tu écris, donc tu sais
ce que tu veux relire. Les PUT et les GET sont
consistants, dans la mesure ou tu écris et lis
des variables de même type.

Voici par exemple:

Dim f As Integer
Dim n As Long

n = -32768
f = FreeFile
Open "c:test.dat" For Binary As #f
Put #f, , n
Close #f
n = 0
f = FreeFile
Open "c:test.dat" For Binary As #f
Get #f, , n
Close #f
Debug.Print n

Sinon, les Integer et les Long sont stockés sur
4 octets, en little endian (LSB en premier), le
tout avec un bit de signe et en complément à 2
pour les négatifs...
Par exemple:
0 = 00 00 00 00
1 = 01 00 00 00
32767 = FF 7F 00 00
-1 = FF FF FF FF
-32767 = 01 80 FF FF
etc.

Ceci dit, c'est une (très) mauvaise(tm) idée
de stocker en format binaire:
- pas lisible par un humain
- pas portable (à cause de l'endianess qui peut varier)
- pénible à debugger
- etc.

A part pour des utilisations particulières (énormes
fichiers de données compressées, genre du flux audio
ou vidéo), cette méthode est à bannir à tout prix.

Les arguments de taille et de temps d'accès n'existent
peu ou plus sur les machines actuelles.
Voir à ce sujet:
http://faq.vb.free.fr/index.php?question3

Bien sur, il est possible que tu ais des contraintes
que je ne connais pas, tout est possible :-)

Bonne suite,

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Pierre Archambault
Bonjour Jean-Marc,

Je suis heureux que tu ait compris ma demande. Ta réponse est tout à fait
dans le sens de ce que j'attendais.

Cependant j'aimerais un peu plus d'éclaircissements au sujet des complémemts
de 2 pour les négatifs.

J'ai constaté que sur la calculatrice de Windows, (en mode scientifique), si
je tape -1 en binaire, et que je convertisse en décimal, j'obtiens :
une suite de 64 "1", ce qui m'a complètement décontenancé !

Si une variable Currency par exemple qui contient le nombre 22 est
sauvegardée dans un fichier, au moment de récupérer la chaîne de caractères
correspondant aux 8 bytes, nous avons les caractères suivants: `[ .
C'est-à-dire chr(96), chr(91), chr(3) et 5 autres chr(0).

Si nous retrouvons les valeurs binaires de chacun de ces nombres
96 : 01100000
91 : 01011011
3 : 00000011
et que nous les replacions dans l'ordre du moins significatif au plus
significatif, nous obtenons :
000000110101101101100000 et en retirant les 0 non significatifs,
110101101101100000

Cette valeur binaire correspond bien à 220000, et comme le format Currency
est sensé avoir été multiplié par 10000, il suffit de diviser par 10000 pour
retrouver le nombre de départ (22).

Voilà pour le positif. Mais si je sauvegarde -22 dans mon fichier et que je
récupère la chaîne de 8 bytes, celle-ci à plutôt cette apparence:
¤üÿÿÿÿÿ. C'est-à-dire chr(160), chr(164), chr(252) et 5 autres chr(255).

J'ai une fonction maison qui transforme une chaîne binaire en décimal mais
elle ne semble pas fonctionner si mon nombre est négatif.

En effet, je me trouverais à lui présenter une chaîne qui commence avec 59
"1" puis : 01010

Or, comment savoir que le nombre ainsi représenté est un négatif et comment
faire pour que ma routine me donne la bonne réponse (-22) ?

Merci de ton temps.

Pierre


"jm" a écrit dans le message de news:
457806cc$0$5531$
"Pierre Archambault" wrote in message
news:N4Kdh.130713$
Bonjour à tous,

Je voudrais savoir comment VB enregistre dans un fichier les valeurs
numériques comme les Integers, Singles, Doubles, Currency etc.

La raison de cette demande est celle-ci:

Je stocke sur disque, des données que j'accède ensuite à l'aide de
l'instruction :

Open "Fichier.dat" for Binary Access Read Shared As #1
Seek #1,1
Get #1, Tampon$




Hello,

C'est quelque chose dont tu ne dois pas avoir
à te soucier, puisque si tu écris en binaire,
alors tu sais ce que tu écris, donc tu sais
ce que tu veux relire. Les PUT et les GET sont
consistants, dans la mesure ou tu écris et lis
des variables de même type.

Voici par exemple:

Dim f As Integer
Dim n As Long

n = -32768
f = FreeFile
Open "c:test.dat" For Binary As #f
Put #f, , n
Close #f
n = 0
f = FreeFile
Open "c:test.dat" For Binary As #f
Get #f, , n
Close #f
Debug.Print n

Sinon, les Integer et les Long sont stockés sur
4 octets, en little endian (LSB en premier), le
tout avec un bit de signe et en complément à 2
pour les négatifs...
Par exemple:
0 = 00 00 00 00
1 = 01 00 00 00
32767 = FF 7F 00 00
-1 = FF FF FF FF
-32767 = 01 80 FF FF
etc.

Ceci dit, c'est une (très) mauvaise(tm) idée
de stocker en format binaire:
- pas lisible par un humain
- pas portable (à cause de l'endianess qui peut varier)
- pénible à debugger
- etc.

A part pour des utilisations particulières (énormes
fichiers de données compressées, genre du flux audio
ou vidéo), cette méthode est à bannir à tout prix.

Les arguments de taille et de temps d'accès n'existent
peu ou plus sur les machines actuelles.
Voir à ce sujet:
http://faq.vb.free.fr/index.php?question3

Bien sur, il est possible que tu ais des contraintes
que je ne connais pas, tout est possible :-)

Bonne suite,

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/




Avatar
Jean-marc
"Pierre Archambault" a écrit dans le
message de news: XW_dh.20080$
Bonjour Jean-Marc,



Re :-)

Je suis heureux que tu ait compris ma demande. Ta réponse est tout à fait
dans le sens de ce que j'attendais.

Cependant j'aimerais un peu plus d'éclaircissements au sujet des
complémemts de 2 pour les négatifs.

J'ai constaté que sur la calculatrice de Windows, (en mode scientifique),
si je tape -1 en binaire, et que je convertisse en décimal, j'obtiens :
une suite de 64 "1", ce qui m'a complètement décontenancé !



Rien ne te dit que la calculatrice fait ce que fait VB, même si ici
c'est bien le cas.

Si une variable Currency par exemple qui contient le nombre 22 est
sauvegardée dans un fichier, au moment de récupérer la chaîne de
caractères correspondant aux 8 bytes, nous avons les caractères suivants:
`[ . C'est-à-dire chr(96), chr(91), chr(3) et 5 autres chr(0).
Si nous retrouvons les valeurs binaires de chacun de ces nombres
96 : 01100000
91 : 01011011
3 : 00000011
et que nous les replacions dans l'ordre du moins significatif au plus
significatif, nous obtenons :
000000110101101101100000 et en retirant les 0 non significatifs,
110101101101100000



ok

Cette valeur binaire correspond bien à 220000, et comme le format Currency
est sensé avoir été multiplié par 10000, il suffit de diviser par 10000
pour retrouver le nombre de départ (22).



re ok.

Voilà pour le positif. Mais si je sauvegarde -22 dans mon fichier et que
je récupère la chaîne de 8 bytes, celle-ci à plutôt cette apparence:
¤üÿÿÿÿÿ. C'est-à-dire chr(160), chr(164), chr(252) et 5 autres chr(255).



Non.

Si on fait ceci:
Dim f As Integer
Dim c As Currency

f = FreeFile
c = -22
Open "c:test.dat" For Binary As #f
Put #f, , c
Close #f

le fichier test.dat contient:
A0 A4 FC FF FF FF FF FF

Tu sais que c'est un négatif car si tu regardes
la valeur binaire du premier octet (A0): 1000 0000

Tu vois que le bit 8 vaut 1; C'est le bit de signe.

Il t'indique ici que le nombre est négatif.

Tu n'as plus qu'à refaire l'opération (pénible) de
complément à 2 à l'envers.

Je te laisse Googler pour faire cette opération, car
la , j'ai la flemme, et en plus, je déteste faire des
opérations bitwise en VB :-))

Bonne suite!

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Jean-marc
> Voilà pour le positif. Mais si je sauvegarde -22 dans mon fichier et que
je récupère la chaîne de 8 bytes, celle-ci à plutôt cette apparence:
¤üÿÿÿÿÿ. C'est-à-dire chr(160), chr(164), chr(252) et 5 autres chr(255).



J'ai dit "Non." dans l'autre post, mais en fait c'est "OUI!" :-)

tu as donné les valeurs en décimal, j'avais mal lu :-)

Le reste est ok dans le post précédent :-))

Sorry!


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/

"Pierre Archambault" a écrit dans le
message de news: XW_dh.20080$
Avatar
Jean-marc
re moi.

Décidément il faut que j'aille me coucher...

A0 en binaire vaut 1010 0000 et non pas 1000 0000 comme j'avais dit.

Le reste est correct, l'important ici est que le bit le plus à gauche vaut
1,
ce qui indique un nombre négatif.

voir d'ailleurs:
http://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
Avatar
Pierre Archambault
Bonne nuit Jean-Marc

Et merci pour ce fier coup de pouce.

Pierre


"Jean-marc" a écrit dans le message
de news: 457883c4$0$30052$
re moi.

Décidément il faut que j'aille me coucher...

A0 en binaire vaut 1010 0000 et non pas 1000 0000 comme j'avais dit.

Le reste est correct, l'important ici est que le bit le plus à gauche vaut
1,
ce qui indique un nombre négatif.

voir d'ailleurs:
http://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic