Magic Numbers System
Posted: Sat Sep 07, 2013 12:56 pm
Hello everyone,
A Magic Numbers System similar to the one used by ID Software for their MD2 and MD3 3D models used by the Quake 2 and Quake 3 engine.
I have created a command to convert 4 and 8 characters string into a Long or Quad number and convert them back to string using a similar technics.
If they can be useful for someone else.
Best regards.
StarBootics
A Magic Numbers System similar to the one used by ID Software for their MD2 and MD3 3D models used by the Quake 2 and Quake 3 engine.
I have created a command to convert 4 and 8 characters string into a Long or Quad number and convert them back to string using a similar technics.
If they can be useful for someone else.
Code: Select all
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : Magic Numbers System
; File Name : Magic Numbers System.pb
; File version: 1.0.0
; Programming : OK
; Programmed by : StarBootics
; Date : 07-09-2013
; Last Update : 07-09-2013
; PureBasic code : V5.20 beta 17 LTS
; Platform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Notes :
;
; This Magic Number system is similar to the
; one used in MD2, MD3 ID Software files for
; the Quake 3 engine.
;
; The technics consist of encoding a 4 characters
; string into an Int32 number.
;
; For controling specific file versioning system
; I need to encode a 6 characters string in the
; same way so I use a Quad instead of Long.
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Procedure.l String_To_MagicLongNumber(String.s)
If Len(String) > 4
ProcedureReturn -1
Else
Char00 = Asc(Mid(String, 4, 1))
Char01 = Asc(Mid(String, 3, 1))
Char02 = Asc(Mid(String, 2, 1))
Char03 = Asc(Mid(String, 1, 1))
MagicLongNumber.l = Char00 << 24 + Char01 << 16 + Char02 << 8 + Char03
EndIf
ProcedureReturn MagicLongNumber
EndProcedure
Procedure.q String_To_MagicQuadNumber(String.s)
If Len(String) > 8
ProcedureReturn -1
Else
Char00 = Asc(Mid(String, 8, 1))
Char01 = Asc(Mid(String, 7, 1))
Char02 = Asc(Mid(String, 6, 1))
Char03 = Asc(Mid(String, 5, 1))
Char04 = Asc(Mid(String, 4, 1))
Char05 = Asc(Mid(String, 3, 1))
Char06 = Asc(Mid(String, 2, 1))
Char07 = Asc(Mid(String, 1, 1))
MagicQuadNumber.q = Char00 << 56 + Char01 << 48 + Char02 << 40 + Char03 << 32 + Char04 << 24 + Char05 << 16 + Char06 << 8 + Char07
EndIf
ProcedureReturn MagicQuadNumber
EndProcedure
Procedure.s MagicLongNumber_To_String(MagicNum.l)
Char03 = MagicNum >> 24 & $FF
Char02 = MagicNum >> 16 & $FF
Char01 = MagicNum >> 8 & $FF
Char00 = MagicNum & $FF
ProcedureReturn Chr(Char00) + Chr(Char01) + Chr(Char02) + Chr(Char03)
EndProcedure
Procedure.s MagicQuadNumber_To_String(MagicNum.q)
Char07 = MagicNum >> 56 & $FF
Char06 = MagicNum >> 48 & $FF
Char05 = MagicNum >> 40 & $FF
Char04 = MagicNum >> 32 & $FF
Char03 = MagicNum >> 24 & $FF
Char02 = MagicNum >> 16 & $FF
Char01 = MagicNum >> 8 & $FF
Char00 = MagicNum & $FF
ProcedureReturn Chr(Char00) + Chr(Char01) + Chr(Char02) + Chr(Char03) + Chr(Char04) + Chr(Char05) + Chr(Char06) + Chr(Char07)
EndProcedure
CompilerIf #PB_Compiler_IsMainFile
MagicLongNum.l = String_To_MagicLongNumber("IDP3")
Debug MagicLongNum
Debug MagicLongNumber_To_String(MagicLongNum)
Debug ""
MagicQuadNum.q = String_To_MagicQuadNumber("V1.0.2.0")
Debug MagicQuadNum
Debug MagicQuadNumber_To_String(MagicQuadNum)
CompilerEndIf
; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<
StarBootics