1、位操作
& 位与
| 位或
~ 位取反(异或)
>> 逻辑右移
<< 左移
print(string.format("%x", 0xff & 0xabcd))
print(string.format("%x", 0xff | 0xabcd))
print(string.format("%x", 0xaaaa ~ -1))
print(string.format("%x", ~0))
输出:
cd
abff
ffffffffffff5555
ffffffffffffffff
lua中的位数是64。负数偏移表示向相反方向,a >> n相当于a << -n
2、无符号整数
x = 3 << 62
print(x)
print(string.format("%u", x))
print(string.format("0x%X", x))
输出:
-4611686018427387904
13835058055282163712
0xC000000000000000
默认比较是有符号,无符号比较通过math.ult
3、打包和解包二进制数据
分别使用string.pack和string.unpack,其第一个参数表示格式化字符串,其中string.unpack还会返回在最后项之后的位置,string.unpack的第三个参数表示从哪个位置开始读
3.1 整数类型
格式化字符串支持
b | char |
h | short |
i | int |
l | long |
j | 使用Lua整数的大小 |
如果使用固定的,与机器无关的大小,使用前缀i选项外加1-16的整数。
每个选项有其大写版本,表示无符号的。对于无符号的,还有T选项,表示size_t
3.2 字符串类型
格式化字符串支持形式有
z | \0结束的字符串 |
cn | 固定长度的字符串,其中n表示所占的字节数 |
sn | 具有显示长度的字符串,先存储字符的长度,其中n表示用于存储长度的大小 |
s = string.pack("s1", "hello")
for i = 1, #s do
print((string.unpack("B", s, i)))
end
输出:
5
104
101
108
108
111
3.3 浮点型
支持的有
f | 单精度 |
d | 双精度 |
n | Lua浮点类型 |
3.4 大小端格式
> | 大端字节序(网络字节序) |
< | 小端字节序 |
= | 默认机器字节序 |
print(string.format("%x", 1000000))
s = string.pack(">i4", 1000000)
for i = 1, #s do
print((string.unpack("B", s, i)))
end
输出:
f4240
0
15
66
64
print(string.format("%x %x", 500, 24))
s = string.pack("<i2 i2", 500, 24)
for i = 1, #s do
print((string.unpack("B", s, i)))
end
输出:
1f4 18
244
1
24
0
3.5 对齐
!n 以n的整数倍对齐