MoneyWorks 6 and earlier encodes privileges as a string where each privilege is represented by a character in the range 32-130. This is kind of wasteful and also unfortunate, because the last 3 codes are not valid utf-8. Making them valid utf-8 would break the privilege encoding.
In v7, privileges are automatically transmogrified to a bitmap that is stored as a 64 nybble hexadecimal string (the hex encoding is done longword-wise little-endian, which happens to be the MoneyWorks network protocol byte order).
<login> <lastmodifiedtime>20110131133003</lastmodifiedtime> <initials>rmd</initials> <name>Rowan</name> <privileges> ffffffefffffffffffffffff0000008000000000000000000000000000000000 </privileges> </login>
If you are testing privileges, the recommended way of doing so is using the Allowed() function, which takes a textual privilege name. If you're decoding the privileges field yourself, you will need to decode the hexadecimal string to test the bit you want.
on HexDecodeSample
let bit = 0
let hex = "ffffffefffffffffffffffff0000008000000000000000000000000000000000"
foreach word in (0, length(hex) / 8)
let hexlong = ""
foreach byte in (0, 3)
let hexlong = hexlong + mid(hex, word * 8 + (4 - byte) * 2 - 1, 2)
endfor
let w = val("#" + hexlong)
let mask = #80000000
foreach bitoff in (0, 31)
if TestFlags(w, mask)
syslog("bit " + bit + " set")
else
syslog("bit " + bit + " NOT set")
endif
let mask = mask / 2
let bit = bit + 1
endfor
endfor
end