Page 1 sur 1

Problème Codage / Décodage base 255

Publié : dim. 14/déc./2014 22:45
par Lord Nelson
Salut,

Oui encore dans mes expériences...

J'ai créer deux procédure pour coder et décoder un nombre en base 10 vers 255 et inversement.
Je suis confronté à un problème lorsque le programme dois décoder le nombre en base 255 vers 10 quand il y a un Chr(0) dans la chaîne.

En gros, quand il trouve un Chr(0) dans la chaîne, il prends ça pour la fin de la chaîne et normale car c'est pure basic
qui est comme ça mais dans mon cas à moi, ça m’embarrasse bien car du coup plus rien ne fonctionne :? :cry:

Exemple avec le nombre 256, à partir de 65536 jusqu'à 65792...
Si seulement je pouvais lui dire de partir, à partir du Chr(1) jusqu'à Chr(255) et de pas utiliser de Chr(0) mais là je coince j'avoue :|

Si quelqu’un pouvais me filer un ch'ti coup de pouce, se serait superbe :)
Merci.

Voici le code:

Code : Tout sélectionner

; Comvertie un nombre base 10 vers base 255 en octet.
Procedure.S CodeNombreBase255(Nombre.Q)
  
  Protected NombreBase255$ = ""
  Protected NombreSortie.Q = 0
  
  Repeat
    
    NombreSortie.Q = Nombre.Q / 256
    NombreBase255$ = InsertString(NombreBase255$, Chr(Nombre.Q - (NombreSortie.Q * 256)), 1)
    Nombre.Q = NombreSortie.Q
    
  Until Nombre.Q = 0
  
  ProcedureReturn NombreBase255$
  
EndProcedure

; Comvertie un nombre base 255 en octet vers un nombre base 10.
Procedure.Q DecodeNombreBase255(Base255$)
  
  Protected NombreSortie.Q = 0
  Protected Valeur.I = 0
  
  If Base255$ > ""
    
    For Index = 1 To Len(Base255$)
      
      Valeur.I = Asc(Mid(Base255$, Index, 1))
      
      If Valeur.I = 0
        NombreSortie.Q * 256
        
      ElseIf Valeur.I > 0
        NombreSortie.Q * 256
        NombreSortie.Q + Valeur.I
        
      EndIf
      
    Next
    
    ProcedureReturn NombreSortie.Q
    
  Else
    ProcedureReturn 0
    
  EndIf
  
EndProcedure

Nombre.Q = 256

Base255$ = CodeNombreBase255(Nombre.Q)
Base10 = DecodeNombreBase255(Base255$)

Debug Nombre.Q
Debug Base255$
Debug Base10

Re: Problème Codage / Décodage base 255

Publié : lun. 15/déc./2014 17:32
par Demivec
en Base 255 -> chiffre = 0 - 254
en Base 256 -> chiffre = 0 - 255

Ce est pour Base 255 (chaque chiffre [0 -> 254] + 1):

Code : Tout sélectionner

; Comvertie un nombre base 10 vers base 255 en octet.
Procedure.S CodeNombreBase255(Nombre.Q)
  
  Protected NombreBase255$ = ""
  Protected NombreSortie.Q = 0
  
  Repeat
    
    NombreSortie.Q = Nombre.Q / 255
    NombreBase255$ = InsertString(NombreBase255$, Chr(Nombre.Q - (NombreSortie.Q * 255) + 1), 1)
    Nombre.Q = NombreSortie.Q
    
  Until Nombre.Q = 0
  
  ProcedureReturn NombreBase255$
  
EndProcedure

; Comvertie un nombre base 255 en octet vers un nombre base 10.
Procedure.Q DecodeNombreBase255(Base255$)
  
  Protected NombreSortie.Q = 0
  Protected Valeur.I = 0
  
  If Base255$ > ""
    
    For Index = 1 To Len(Base255$)
      
      Valeur.I = Asc(Mid(Base255$, Index, 1)) - 1
      
      If Valeur.I = 0
        NombreSortie.Q * 255
        
      ElseIf Valeur.I > 0
        NombreSortie.Q * 255
        NombreSortie.Q + Valeur.I
        
      EndIf
      
    Next
    
    ProcedureReturn NombreSortie.Q
    
  Else
    ProcedureReturn 0
    
  EndIf
  
EndProcedure

; Nombre.Q = 256
; 
; Base255$ = CodeNombreBase255(Nombre.Q)
; Base10 = DecodeNombreBase255(Base255$)
; 
; Debug Nombre.Q
; Debug Base255$
; Debug Base10

For Nombre.Q = 1 To 1024

  Base255$ = CodeNombreBase255(Nombre.Q)
  Base10 = DecodeNombreBase255(Base255$)
  
  Debug "" + Nombre.Q + " : " + Base255$ + " : " + Base10
Next
un autre choix:

Code : Tout sélectionner

; Comvertie un nombre base 10 vers base 256 en octet.
; Nécessite un caractère supplémentaire pour garder la trace de toutes les zéros.
Procedure.S CodeNombreBase256(Nombre.Q)
  
  Protected NombreBase256$ = ""
  Protected NombreSortie.Q = 0
  Protected zero = 1, chiffre
  
  Repeat
    
    NombreSortie.Q = Nombre.Q / 256
    chiffre = Nombre.Q - (NombreSortie.Q * 256)
    
    zero << 1
    If chiffre = 0
      zero | 1
      chiffre = 1
    EndIf
      
    NombreBase256$ = InsertString(NombreBase256$, Chr(chiffre), 1)
    Nombre.Q = NombreSortie.Q
    
  Until Nombre.Q = 0
  NombreBase256$ = InsertString(NombreBase256$, Chr(zero), 1)
  
  ProcedureReturn NombreBase256$
  
EndProcedure

; Comvertie un nombre base 256 en octet vers un nombre base 10.
; Utilise le premier caractère de garder une trace de tous les zéros.
Procedure.Q DecodeNombreBase256(Base256$)
  
  Protected NombreSortie.Q = 0
  Protected Valeur.I = 0, zero
  
  zero = Asc(Left(Base256$, 1))
  If Base256$ > ""
    
    For Index = 2 To Len(Base256$)
      
      Valeur.I = Asc(Mid(Base256$, Index, 1))
      If zero & 1
        Valeur - 1
      EndIf
      zero >> 1
      
      NombreSortie.Q * 256
      NombreSortie.Q + Valeur.I
      
    Next
    
    ProcedureReturn NombreSortie.Q
    
  Else
    ProcedureReturn 0
    
  EndIf
  
EndProcedure
CallDebugger
; Nombre.Q = 256
; 
; Base255$ = CodeNombreBase256(Nombre.Q)
; Base10 = DecodeNombreBase256(Base256$)
; 
; Debug Nombre.Q
; Debug Base256$
; Debug Base10

For Nombre.Q = 1 To 1024

  Base256$ = CodeNombreBase256(Nombre.Q)
  Base10 = DecodeNombreBase256(Base256$)
  
  Debug "" + Nombre.Q + " : " + Base256$ + " : " + Base10
Next

Re: Problème Codage / Décodage base 255

Publié : mar. 16/déc./2014 7:51
par Lord Nelson
Salut et merci beaucoup Demivec :D
Perso je préfère largement le premier code :wink:
@+