Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 2012
-
12 juin 2010 à 00:06
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024
-
12 juin 2010 à 22:20
Bonjour,
Je suis en trein de travailler sur la lecture des données dans un fichier en mode binaire. Je dois lire une valeur de type UInteger.
Mais voila, j'utilise la méthode FileGet (qui marche ma fois fort bien) mais qui ne peut pas travailler avec les UInteger.
Mon idée étant de faire une fonction Integer_to_UInteger(Integer)Uniteger
A l'origine je voulais travailler avec CopyMemory mais d'un je n'arrive pas a m'en servir en VB.Net et deux d'après ce que j'ai vu sur internet, ce ne serrait pas conseillés.
Je tiens à préciser que le programme demande à être le plus rapide possible en temps d'éxécution !!!
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 12 juin 2010 à 01:05
Bonjour,
Je vais tenter un code :
if MyInt>=0, un simple cast suffira
sinon :
MyUInt=cuint((MyInt AND Integer.MaxValue) or (clng(integer.MinValue) AND UInteger.MaxValue))
à tester.
On manipule les bits, la valeur Max est : &h7FFFFFFF
La valeur min est : &h80000000
donc en jouant avec, on parvient à faire la conversion.
ça fonctionne aussi avec les les masques, mais cette méthode fonctionne avec les types variés de numériques.
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 12 juin 2010 à 01:03
En bidouillant j'ai trouvé ça :
'convertir Short en UShort :
Dim p_nb as UShort
Dim nb as Short = - &hFF
If (nb >= 0) Then
p_nb = nb
Else
Dim Tmp(0 To 1) As Byte
Tmp(0) = nb And &HFF
Tmp(1) = (nb >> 8) And &HFF
p_nb = Tmp(0) + Tmp(1) * 2 ^ 8
End If
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 12 juin 2010 à 11:01
Bonjour et merci pour ta réponse NHenry
je te confirme qu'elle marche
pas forcement plus rapide que la méthode que j'indique elle a le mérite d'être plus propre à écrire et surtout elle peut être facilement modifiée pour travailler sur plusieurs types. Je l'ai adaptée pour pouvoir l'utiliser dans mon programme :
Public Shared Function To_Unsigned(ByVal value As Short) As UShort
If (value >= 0) Then
Return value
Else
Return CUShort((value And Short.MaxValue) Or (CLng(Short.MinValue) And UShort.MaxValue))
End If
End Function
Public Shared Function To_Unsigned(ByVal value As Integer) As UInteger
If (value >= 0) Then
Return value
Else
Return CUInt((value And Integer.MaxValue) Or (CLng(Integer.MinValue) And UInteger.MaxValue))
End If
End Function
Domage, j'aimais bien la solution du copyMemory ^_^. Ca doit être une déformation de mes longues années de VB6.