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
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