Lecture binaire d'un fichier VB6
Bonjour,
Je migre (réécrit) un petit logiciel VB6 en C#. Je m'attarde actuellement à pouvoir lire les fichiers data existant fait dans une stucture binaire VB6 :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| nNumFile = FreeFile
Open sFileTemp For Binary As #nNumFile
If LOF(nNumFile) > 0 Then
Get #nNumFile, , lLen
lSeek = Seek(nNumFile)
Set macollection = New Collection
For i = 1 To lLen
Set oObjet = New cMaClasse
oObjet.Load nNumFile, lSeek
macollection.Add ass
Next
End If
Close #nNumFile |
et das le .Load :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Public Sub Load(ByVal numFile As Long, ByRef lSeek As Long)
Get #numFile, , ID 'long
Get #numFile, , CoefMO 'single
Get #numFile, , TypeAss 'Integer
'Lecture chaine
Dim lLen As Long
Get #numFile, , lLen 'Longueur à lire
If lLen > 0 Then
Code = Space$(lLen)
Get #numFile, , Code
End If
'Sous classe
oFontText.Load numFile
lSeek = Seek(numFile)
End Sub |
et dans la classe d'oFont :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| Public Sub Load(ByVal numFile As Long)
Dim lLen As Long
Dim i As Integer
Dim lValue As Long
Dim nLocalVersion As Integer
Get #numFile, , nLocalVersion
Get #numFile, , iBold
Get #numFile, , iItalic
Get #numFile, , iUnderline
Get #numFile, , iStrikethrough
Get #numFile, , iSize
Get #numFile, , iWeight
Get #numFile, , iCharSet
Get #numFile, , iColor
Dim i As Long
Get #hFile, , i
If i > 0 Then
sText = Space$(i)
Get #hFile, , iFontName
End If
End Sub |
Voilà pour planter le décor et mon anguoisse.
En C# c'est assez différent me semble-t-il...
J'ai commencé comme cela mais déjà je bloque :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public void Load(string fileName)
{
FileStream stream = new FileStream(fileName, FileMode.Open);
BinaryReader reader = new BinaryReader(stream);
int value = reader.ReadInt32();
for (int i = 0; i < value; i++)
{
maClasse oObjet = new maClasse();
ass.ID = reader.ReadInt32();
ass.CoefMO = reader.ReadSingle();
ass.TypeAss = reader.ReadInt16();
//là ca me semble mauvais comme code :
lLen = reader.ReadInt32();
if (lLen > 0)
{
string sSt = new String(' ', lLen);
ass.Code = reader.ReadString();
}
//et là pire :
Classes.Font oFont = new Classes.Font();
oFont.Load(reader);
(...)
}
} |
et la classe oFont :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| namespace Classes
{
class Font
{
private short mVersion=1 ;
string iFontName="arial";
bool iBold =false;
bool iItalic ;
bool iUnderline;
bool iStrikethrough ;
double iSize=8.25;
short iWeight;
short iCharSet;
int iColor=0;
public void Load(BinaryReader reader)
{
short nLocalVersion= reader.ReadInt16();
iBold=reader.ReadBoolean();
iItalic=reader.ReadBoolean();
iUnderline=reader.ReadBoolean();
iStrikethrough=reader.ReadBoolean();
iSize = reader.ReadDouble();
iWeight= reader.ReadInt16();
iCharSet= reader.ReadInt16();
iColor = reader.ReadInt32();
//Get #hFile, , i
//If i > 0 Then
// sText = Space$(i)
// Get #hFile, , sText
// LoadString = Crypte(sText)
//End If
int lLen = reader.ReadInt32();
if (lLen > 0)
{
string sText = new String(' ', lLen);
iFontName = reader.ReadString();
}
}
}
} |
Je suis preneur de toutes remarques ! :aie: au secours...;)
Avancement de mes recherches
Déjà je viens de constater qu'un boolean VB6 est codé sur 2 octect alors de ReadBoolean n'en lit qu'un seul donc :
Code:
1 2 3
|
//iBold=reader.ReadBoolean(); DEVIENT :
iBold=reader.Convert.ToBoolean(reader.ReadInt16()); |