Well, I was looking at this and left bit-shifts simply don’t work after a while. Shifting by 4 or 8 are OK but shifting by 12 always gives the wrong value. I imagine this is something to do with ZBrush storing zscript values as floats.
There are also problems with larger numbers, so that, for example, if you try and add 1677720 to 251658240, ZBrush will give you 268435456. Again, probably due to using floats.
So the following example will parse HEX strings of up to 6 digits. (At least, I think it’s OK…)
[RoutineDef,ParseHEX,
[VarDef,hexStr,""]
[If,[StrFind,"0x",hexStr]==0,
[VarSet,hexStr,[StrExtract,hexStr,2,255]]
]
[If,[StrLength,hexStr]>6,
[Note,"\CffffffHEX string too long -
\n\Cff9234Please enter a shorter HEX \Cff9234string and try again"]
[Exit]
]
[VarDef,charStr,""]
[VarDef,char,0]
[VarSet,hexStr,[StrUpper,hexStr]]
[VarSet,loopN,[StrLength,hexStr]]
[VarSet,index,loopN-1]
[VarSet,subVal,0]
[Loop,loopN,
[VarSet,charStr,[StrExtract,hexStr,index,index]]
[VarSet,asc,[StrToAsc,charStr]]
[If,((asc>=48)&&(asc <=57)),// 0 - 9
[VarSet,char,charStr]
,//else
[If,((asc>=65)&&(asc <=70)),// A - F
[Loop,1,
[If,(asc == 65),[VarSet,char,10][LoopExit]]//A
[If,(asc == 66),[VarSet,char,11][LoopExit]]//B
[If,(asc == 67),[VarSet,char,12][LoopExit]]//C
[If,(asc == 68),[VarSet,char,13][LoopExit]]//D
[If,(asc == 69),[VarSet,char,14][LoopExit]]//E
[If,(asc == 70),[VarSet,char,15][LoopExit]]//F
]
,//else not a HEX string
[Note,"\Cff9234Please enter a \CffffffHEX \Cff9234string and try again"][Exit]
]
]
[VarSet,m,(16^^([Val,n]))]
[VarMul,char,[Val,m]]
[VarAdd,sum,[Val,char]]
[VarDec,index]
,n]
,hexStr,sum]
[IButton,GetHexValue,"Get decimal value from HEX string",
[VarDef,hexValStr,""]
[VarSet,hexValStr,[StrAsk,"0x000000","Please enter a HEX value"]]
[If,[StrLength,hexValStr],
[VarSet,result,0]
[RoutineCall,ParseHEX,hexValStr,result]
[Note,[StrMerge,"\Cff9234HEX value in decimal is: \Cffffff",result]]
]
]