VLint BigEndian/LittleEndian

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
pcfreak
Beiträge: 1
Registriert: 01.09.2005 13:35
Kontaktdaten:

VLint BigEndian/LittleEndian

Beitrag von pcfreak »

VLint ... variable length integer

Integer mit variabler Länge.
Wird z.B. in EBML benutzt. http://ebml.sourceforge.net/

Informationen zu LittleEndian und BigEndian:
http://de.wikipedia.org/wiki/Big_endian

Little Endian

Code: Alles auswählen

Procedure.l ReadVLint_LittleEndian()
 byte1.l=ReadByte() & $FF
 If byte1 & %10000000
  ProcedureReturn byte1 & %01111111
 Else
  byte2.l=ReadByte() & $FF
  If byte1 & %01000000
   ProcedureReturn (byte1 & %00111111) | (byte2<<6)
  Else
   byte3.l=ReadByte() & $FF
   If byte1 & %00100000
    ProcedureReturn (byte1 & %00011111) | (byte2<<5) | (byte3<<13)
   Else
    byte4.l=ReadByte() & $FF
    If byte1 & %00010000
     ProcedureReturn (byte1 & %00001111) | (byte2<<4) | (byte3<<12) | (byte4<<20)
    Else
     byte5.l=ReadByte() & $FF
     If byte1 & %00001000
      ProcedureReturn (byte1 & %00000111) | (byte2<<3) | (byte3<<11) | (byte4<<19) | (byte5<<27)
     Else
      ProcedureReturn -1
     EndIf
    EndIf
   EndIf
  EndIf
 EndIf
EndProcedure

Procedure WriteVLint_LittleEndian(var.l)
 If var>>7
  If var>>14
   If var>>21
    If var>>28
     WriteByte(%00001000 | (var & %00000111))
     WriteByte((var>>3) & $FF)
     WriteByte((var>>11) & $FF)
     WriteByte((var>>19) & $FF)
     WriteByte((var>>27) & $FF)
    Else
     WriteByte(%00010000 | (var & %00001111))
     WriteByte((var>>4) & $FF)
     WriteByte((var>>12) & $FF)
     WriteByte((var>>20) & $FF)
    EndIf
   Else
    WriteByte(%00100000 | (var & %00011111))
    WriteByte((var>>5) & $FF)
    WriteByte((var>>13) & $FF)
   EndIf
  Else
   WriteByte(%01000000 | (var & %00111111))
   WriteByte((var>>6) & $FF)
  EndIf
 Else
  WriteByte(%10000000 | (var & %01111111))
 EndIf
EndProcedure

If CreateFile(1,"endian.dat")
  WriteVLint_LittleEndian(23)
  WriteVLint_LittleEndian(599)
  WriteVLint_LittleEndian(35555)
  WriteVLint_LittleEndian(33333333)
  WriteVLint_LittleEndian(3333222113)
 CloseFile(1)
Else
 Debug "Error: Creating File"
EndIf

If ReadFile(1,"endian.dat")
 Debug ReadVLint_LittleEndian()
 Debug ReadVLint_LittleEndian()
 Debug ReadVLint_LittleEndian()
 Debug ReadVLint_LittleEndian()
 Debug StrU(ReadVLint_LittleEndian(),2)
 CloseFile(1)
Else
 Debug "Error: Reading File"
EndIf
Big Endian

Code: Alles auswählen

Procedure.l ReadVLint_BigEndian()
 byte1.l=ReadByte() & $FF
 If byte1 & %10000000
  ProcedureReturn byte1 & %01111111
 Else
  byte2.l=ReadByte() & $FF
  If byte1 & %01000000
   ProcedureReturn ((byte1 & %00111111)<<8) | byte2
  Else
   byte3.l=ReadByte() & $FF
   If byte1 & %00100000
    ProcedureReturn ((byte1 & %00011111)<<16) | (byte2<<8) | byte3
   Else
    byte4.l=ReadByte() & $FF
    If byte1 & %00010000
     ProcedureReturn ((byte1 & %00001111)<<24) | (byte2<<16) | (byte3<<8) | byte4
    Else
     byte5.l=ReadByte() & $FF
     If byte1 & %00001000
      ProcedureReturn (byte2<<24) | (byte3<<16) | (byte4<<8) | byte5
     Else
      ProcedureReturn -1
     EndIf
    EndIf
   EndIf
  EndIf
 EndIf
EndProcedure

Procedure WriteVLint_BigEndian(var.l)
 If var>>7
  If var>>14
   If var>>21
    If var>>28
     WriteByte(%00001000)
     WriteByte((var>>24) & $FF)
     WriteByte((var>>16) & $FF)
     WriteByte((var>>8) & $FF)
     WriteByte(var & $FF)
    Else
     WriteByte(%00010000 | ((var>>24) & %00001111))
     WriteByte((var>>16) & $FF)
     WriteByte((var>>8) & $FF)
     WriteByte(var & $FF)
    EndIf
   Else
    WriteByte(%00100000 | ((var>>16) & %00011111))
    WriteByte((var>>8) & $FF)
    WriteByte(var & $FF)
   EndIf
  Else
   WriteByte(%01000000 | ((var>>8) & %00111111))
   WriteByte(var & $FF)
  EndIf
 Else
  WriteByte(%10000000 | (var & %01111111))
 EndIf
EndProcedure

If CreateFile(1,"endian.dat")
  WriteVLint_BigEndian(23)
  WriteVLint_BigEndian(599)
  WriteVLint_BigEndian(35555)
  WriteVLint_BigEndian(33333333)
  WriteVLint_BigEndian(3333222113)
 CloseFile(1)
Else
 Debug "Error: Creating File"
EndIf

If ReadFile(1,"endian.dat")
 Debug ReadVLint_BigEndian()
 Debug ReadVLint_BigEndian()
 Debug ReadVLint_BigEndian()
 Debug ReadVLint_BigEndian()
 Debug StrU(ReadVLint_BigEndian(),2)
 CloseFile(1)
Else
 Debug "Error: Reading File"
EndIf
Vielleicht kann's ja einer gebrauchen...