VB.Net

cs_lgros Messages postés 14 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 18 avril 2005 - 27 mars 2005 à 19:23
cs_lgros Messages postés 14 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 18 avril 2005 - 29 mars 2005 à 22:53
Est-il possible en VB.Net ,dans un fichier binnaire, de lire plusieurs octets mais de 7 bits en 7 bits (de 8 bits en 8 bits, çà c'est facile!) et de retourner une valeur en décimal?..
merci d'avance.
Ludo

13 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
27 mars 2005 à 20:19
Pourrais-tu donner plus d'explications ?
Pour moi, 1 octet c'est 8 bits. VB6 ou VB.NET.
Physiquement, ton fichier doit être codé en 8 bits même s'il n'y en a que 7 d'utilisés (le bit 7 étant à 0, spécificité entièrement anglosaxonne pour le codage des caractères ascii sans accents).

Donne un exemple de ton fichier avec le résultat que tu veux obtenir.

Loup Gris
0
cs_lgros Messages postés 14 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 18 avril 2005 1
27 mars 2005 à 20:57
ok j'explique...

01100110 10101100 11001010

Ces 3 octets représentent les valeurs décimales 102, 172, 202.
Or si on lit 7 bits par 7 bits à partir du début, les valeurs sont 51,43 et 25
0110011 0101011 0011001 (010)

et ce sont bien, et j'en suis sûr, ces valeurs qui sont utilisées...

d'où ma question.

Ludo
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
27 mars 2005 à 21:47
En vb6 comme en vb.net, je ne connais pas le moyen de lire 7bits par 7 bits directement.
Peut - être un moyen détourné : lire 7 octets par 7 octets et, par le biais de conversions, transformer en 8 paquets de 7bits.

Loup Gris
0
cs_lgros Messages postés 14 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 18 avril 2005 1
27 mars 2005 à 22:23
Pourquoi pas...
Et comment transformer 7 octets en paquets de 7 bits?..

Ludo
0

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

Posez votre question
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
28 mars 2005 à 18:07
J'avais un peu de temps alors j'ai adapté un de mes codes.
Désolé, pas pu tester en vb.net et, ne connaissant pas la taille de ton fichier, je suis parti du principe qu'il n'était pas trop grand.
Autre chose, si, dans ton fichier, tu as des fin de lignes et/ou une fin de fichier (genre chr$(13) et/ou chr$(10)) faudra gérer autrement. Je ne te donne que le principe.

Private Sub Form_Load()
Dim s As String
Dim b As String
Dim i As Integer
Dim nf As Integer


nf = FreeFile


' on charge tous le fichier en mémoire
Open "c:\temp\toto.txt" For Input As #nf
s = Input(LOF(nf), #nf)
Close #nf

'on analyse tous les octets de la chaine récupérée
For i = 1 To Len(s)
b = b & Octet_To_Binary(Asc(Mid$(s, i, 1)))

'récup de la valeur d'un packet de 7 bits
MsgBox Valeur_De_7bits("0" & Mid$(b, 1, 7))

b = Mid$(b, 8)

' quand on arrive au 7ème octet, on calcule le 8ème packet de 7bit en plus
If Len(b) = 7 Then
MsgBox Valeur_De_7bits("0" & Mid$(b, 1, 7))
b = ""
End If
Next

' au cas ou il reste quelque chose
If Len(b) > 0 Then MsgBox b

End Sub

'transformation d'un caractère en binaire
Function Octet_To_Binary(nombre As Byte) As String
Dim i As Integer
Dim w_nombre As Byte
Dim str_binary As String


' Représentation binaire d'un octet
For i = 7 To 0 Step -1
If nombre And 2 ^ i Then
str_binary = str_binary & "1"
Else
str_binary = str_binary & "0"
End If
Next

' Renvoi du résultat
Octet_To_Binary = str_binary


End Function


' Transformation d'une chaine "binaire" en valeur byte
Function Valeur_De_7bits(ByVal v As String) As Byte
Dim i As Byte
Dim r As Byte
For i = 1 To 8
If Mid$(v, i, 1) = "1" Then
r = r + 2 ^ (8 - i)
End If
Next
Valeur_De_7bits = r
End Function

Loup Gris
0
cs_lgros Messages postés 14 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 18 avril 2005 1
28 mars 2005 à 21:07
super!
merci!

de mon côté j'avais trouvé sur le net des fonctions pour passer de int en bits et vice verça. J'ai tout mis dans des textBox en espérant les manipuler, mais c'est un peu prise de tête.
Je vais essayer ton code mais il me faut l'adapter...
Pour info le fichier fait 1mo 7 mais les lignes concernées font 43 octets chaqu'une..
Pour arriver à l'octet concerné j'utilise System.io , binaryreader, seek ect...

j'essaye tout çà demain
merci...

Ludo
0
cs_lgros Messages postés 14 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 18 avril 2005 1
28 mars 2005 à 22:27
Mon truc donnez çà en gros...

Public Function ToBinary(ByVal x As Integer) As String
Dim Bin As StringBuilder = New StringBuilder
Do While x > 0
If x Mod 2 = 0 Then
Bin.Insert(0, "0")
Else
Bin.Insert(0, "1")
End If
x = x \ 2
Loop
Bin.Insert(0, "0", 8 - Bin.Length)
Return Bin.ToString
End Function


Private Function ToInteger(ByVal x As Long) As String
Dim temp As String
Dim ch As Char
Dim multiply As Integer = 1
Dim subtract As Integer = 1
Dim len As Integer = CStr(x).Length
For Each ch In CStr(x)
For len = 1 To CStr(x).Length - subtract
multiply = multiply * 2
Next
multiply = CInt(ch.ToString) * multiply
temp = multiply + temp
subtract = subtract + 1
multiply = 1
Next
Return temp
End Function



Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim fileinfo As New FileInfo(Application.StartupPath & "\fifa.db")
Dim filestream As FileStream = New FileStream(Application.StartupPath & "\fifa.db", FileMode.Open)
Dim binaryreader As BinaryReader = New BinaryReader(filestream)


filestream.Seek(4172, SeekOrigin.Begin)


Try
TextBox1.Text = (binaryreader.ReadByte)
TextBox2.Text = (binaryreader.ReadByte)
TextBox3.Text = (binaryreader.ReadByte)
TextBox4.Text = (binaryreader.ReadByte)
TextBox5.Text = (binaryreader.ReadByte)
TextBox6.Text = (binaryreader.ReadByte)
Catch
MessageBox.Show("error Add binary")
Exit Sub
End Try


' Try
'TextBox7.Text = (ToBinary(binaryreader.Read))
' Catch
' MessageBox.Show("error Add binary")
' Exit Sub
' End Try


' filestream.Seek(4173, SeekOrigin.Begin)
' TextBox8.Text = (ToBinary(binaryreader.Read))


'filestream.Seek(4174, SeekOrigin.Begin)
'TextBox9.Text = (ToBinary(binaryreader.Read))


'filestream.Seek(4175, SeekOrigin.Begin)
'TextBox10.Text = (ToBinary(binaryreader.Read))


'filestream.Seek(4176, SeekOrigin.Begin)
'TextBox11.Text = (ToBinary(binaryreader.Read))


' filestream.Seek(4177, SeekOrigin.Begin)
'TextBox12.Text = (ToBinary(binaryreader.Read))


End Sub
aprés j'espérai manipuler les textBox ...
Ludo
0
cs_lgros Messages postés 14 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 18 avril 2005 1
29 mars 2005 à 17:52
Je suis bloqué par l'expression #nf ???
For Input As #nf

Ludo
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
29 mars 2005 à 18:12
As tu mis les lignes :

dim nf as integer
nf = freefile
?

Si tu es sûr que tu n'as pas d'autre fichier ouvert par une instruction open, tu peux remplacer nf par 1. Et ce dans tout le code que je t'ai donné.

nf = freefile affecte un numéro libre de fichier.

Par ex, si quelquepart dans ton prog tu ouvres un fichier avec open.... as #1 et que tu ne le refermes pas, nf sera égal à 2. Sinon, si tu codes un nouveau open .... as #1, il se peut que tu aies des problèmes.

Mais, je ne suis pas sûr que freefile fonctionne avec vn.net.

Loup Gris
0
cs_lgros Messages postés 14 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 18 avril 2005 1
29 mars 2005 à 18:54
En fait c'est "Open" que VB.Net n'aime pas...
Open "c:\temp\toto.txt" For Input As #nf
et si j'écris

Dim filestream As FileStream = New FileStream(Application.StartupPath & "\fifa.db", FileMode.Open)


For Input As #nf

alors là il me jette...

J'ai bien déclaré

dim nf as integer
nf = freefile

et freefile fonctionne en VB.Net

De toute façon, j'ai un autre problème:
Tout n'est pas sur 7 bits, il y en a sur 4 bits, sur 5 bits voir sur 1 bits (oui/non)...Je ne suis pas sortit de l'auberge...

Par contre tes fonctions sont super utiles...

Ludo
0
cs_lgros Messages postés 14 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 18 avril 2005 1
29 mars 2005 à 19:43
Par contre mon systeme de mettre toutes les représentations binaires dans un textBox puis de sélectionner le nombre de "1" et de "0" selon si c'est 7 bits, 4 bits ou 3 bits fonctionnne!

Pour lire pas de problème par contre pour écrire je sens que je vais m'amuser...

Ludo
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
29 mars 2005 à 20:31
L'instruction open, je ne sais pas si ça fonctionne sous vb.net, pas pu tester, suis en congé et je n'ai pas vb.net à dispo. Il doir y avoir l'équivalent.
Mais ton problème devient plus compliqué.
Un coup 7 bits, un coup 5, 4, 3, 2, 1 etc ...
Quelle est en fait la structure de tes enregs ? Est elle fixe ?

Loup Gris
0
cs_lgros Messages postés 14 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 18 avril 2005 1
29 mars 2005 à 22:53
C'est en fait une base de données d'un jeu. Un format propriétaire réfractaire à ADO par exemple. Les enregistrements sont fatalement fixes. Cette ligne de 44 octets se répette à peu prés 1000 fois mais si on en décode une, c'est bon. Mais çà fait 44 octets pour 56 colonnes d'où le hic!
Il y a d'autres tables ds le fichier mais je crois je c'est + simple... Enfin j'espére.

Ludo
0
Rejoignez-nous